현재 동적 표현식을 만드는 중입니다. 다음 시나리오를 사용하고 있습니다. 주어진Expression Tree 로컬 변수를 캡처하는 방법
:
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();
}
}
그래서 내 문제는 내가 술어가 MakePredicate 기능에 의해 생성 된 것과 같도록 MakeDynamicPredicate에서 반환받을 수 없다는 것입니다.
은 내가 reply post from Jon Skeet를 읽을 수 있지만 어떤 도움을 크게 감상 할 수... 로컬 변수를 캡처되도록 constantExpression을 구현하는 방법을 이해하지 않습니다.
추가 정보 : 앞으로 사용할 수있는 클래스를 알지 못해 결국보다 일반적인 것으로 추상화 될 것입니다.
일부 게시물 (Jon Skeet의 게시물)을 언급 한 경우 링크를 사용하면 도움이됩니다. – svick
미안 해요. 전 가서 Jon의 이름을 그가 대답 한 – ermagana