Expression.Bind() - 它实际上做了什么?

问题描述:

所以我最近一直在动态构建表达式树,并碰到这种方法,这看起来有点奇怪。起初我以为“爽哦,这正是我所需要的”后沿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的实例?我找不到使用此方法的任何示例。

Object-Initializer表达式

比方说,你有:

public class Foo 
{ 
    public int Property { get; set; } 
} 

然后,你可以这样做:

var parameter = Expression.Parameter(typeof(int), "i"); 
var newExpr = Expression.New(typeof(Foo)); 
var bindExprs = new[] 
    { 
     Expression.Bind(typeof(Foo).GetProperty("Property"), parameter) 
     // You can bind more properties here if you like. 
    }; 

var body = Expression.MemberInit(newExpr, bindExprs); 
var lambda = Expression.Lambda<Func<int, Foo>>(body, parameter); 

是这样的:

i => new Foo { Property = i } 

老:

我可以”帮助你你会决定解决的“性能问题”(将使用Expression.PropertyOrField真的在你的应用程序中引入瓶颈?我有点怀疑。你应该在过早优化之前确定这一点)编辑:错误地认为这是一个性能优化,并且你已经发现你自己,Expression.MakeMemberAccess是你需要的)的道歉,但我可以告诉你什么Expression.Bind是有用的。

+2

oooh ...我认为这就是它,但是我期待'Expression.New()'接受这个过载。我不觉得这可能是一个完全不同的电话。 – 2013-03-08 16:15:33

+0

关于不使用'PropertyOrField':这不是真正的优化。更像是为了我自己的理智。 – 2013-03-08 16:17:54

+0

啊,如果是这样的话,那么为什么不写一个带有'MemberInfo'和分支的小助手呢? – Ani 2013-03-08 16:20:51