В настоящее время я работаю над созданием динамических выражений, и у меня есть следующий сценарий, в котором я хотел бы помочь.
дано:
public class planet {
public string name { get;set; }
}
class someTestClass {
[Test]
public void Planet_Exists_Statically(){
var planetName = "earth";
var planets = new List<planet> {new planet {name = planetName}};
var found = planets.Exists(MakePredicate(planetName));
Assert.IsTrue(found);
}
[Test]
public void Planet_Exists_Statically(){
var planetName = "earth";
var planets = new List<planet> {new planet {name = planetName}};
var found = planets.Exists(MakeDynamicPredicate(planetName));
Assert.IsTrue(found);
}
private Predicate<planet> MakePredicate(string planetName){
Expression<Predicate<planet>> pred = p => p.name == planetName;
return pred.Compile();
}
private Predicate<planet> MakeDynamicPredicate(string planetName){
var parm = Expression.Parameter(typeof(planet), "p")
var pred = Expression.Lambda<Predicate<planet>>(
Expression.ReferenceEqual(
Expression.Property(parm, typeof(planet), "name"),
**???WHAT GOES HERE???**,
parm);
return pred.Compile();
}
}
Итак, моя проблема в том, что я не могу получить предикат, возвращаемый из MakeDynamicPredicate, чтобы он был равен предикату, сгенерированному функцией MakePredicate.
Я прочитал ответ от Джона Скита, но не понимаю, как реализовать ConstantExpression, чтобы локальная переменная была захвачена. .
Любая помощь будет принята с благодарностью.
Дополнительная информация: в будущем я могу не знать, какой класс используется, поэтому в конечном итоге он будет абстрагирован, чтобы быть более общим.