所以我最近一直在動態構建表達式樹,並碰到這種方法,這看起來有點奇怪。起初我以爲「爽哦,這正是我所需要的」後沿Expression.Bind() - 它實際上做了什麼?
var left = member is FieldInfo ? Expression.Field(instance, (FieldInfo)member) : Expression.Property(instance, (PropertyInfo)member);
var right = ...
var assign = Expression.Assign(left, right);
線不斷編寫代碼是的,我知道有Expression.PropertyOrField()
通話,但它確實往返回反射根據名稱查找成員,因爲我通常已經有MemberInfo
實例。
因此,無論如何,我認爲Expression.Bind()
對我來說是有用的,但它確實做了一些我不太瞭解的事情。給出下面的代碼:
void Main()
{
var m = typeof(Foo).GetField("Bar");
Expression.Bind(m, Expression.Constant("")).Dump();
}
public class Foo
{
public string Bar;
}
它產生MemberAssignment
表達Bar = ""
。但是沒有實例,也沒有靜態引用。我如何將這個表達式應用於Foo
的實例?我找不到使用此方法的任何示例。
oooh ...我認爲這就是它,但是我期待'Expression.New()'接受這個過載。我不覺得這可能是一個完全不同的電話。 – 2013-03-08 16:15:33
關於不使用'PropertyOrField':這不是真正的優化。更像是爲了我自己的理智。 – 2013-03-08 16:17:54
啊,如果是這樣的話,那麼爲什麼不寫一個帶有'MemberInfo'和分支的小助手呢? – Ani 2013-03-08 16:20:51