Zap
메서드에 전달 된 표현식이 트리이므로 Expression Tree Visitor을 사용하여 트리를 걸어 식에서 첫 번째 ConstantExpression
을 찾아야합니다. 그것은 아마 다음과 같은 순서에있을 것입니다 다음 bar
인스턴스가 2 MemberExpression 어디에서 오는지이다 일원으로 인스턴스 내부 클래스로 구현되는 폐쇄에 의해 포착되어
(((source.Body as MemberExpression).Expression as MemberExpression).Expression as ConstantExpression).Value
참고.
편집
는 그런 다음과 같이 생성 된 폐쇄에서 필드를 얻을 수 있습니다
static void Main(string[] args)
{
var bar = new Bar();
bar.Foo = "Hello, Zap";
Zap(() => bar.Foo);
}
private class Bar
{
public String Foo { get; set; }
}
public static void Zap<T>(Expression<Func<T>> source)
{
var param = (((source.Body as MemberExpression).Expression as MemberExpression).Expression as ConstantExpression).Value;
var type = param.GetType();
// Note that the C# compiler creates the field of the closure class
// with the name of local variable that was captured in Main()
var field = type.GetField("bar");
var bar = field.GetValue(param) as Bar;
Debug.Assert(bar != null);
Console.WriteLine(bar.Foo);
}
'Zap (() => 1)'이라고하면 어떻게 될까요? –
그럼 bar.Zim()을 호출하지 않겠습니다. :-) 진심으로, 내가 건네받은 것이 Bar 인스턴스인지보고 싶으면, 인스턴스 메소드를 호출하십시오. 가능한? –