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
是有用的。
oooh ...我认为这就是它,但是我期待'Expression.New()'接受这个过载。我不觉得这可能是一个完全不同的电话。 – 2013-03-08 16:15:33
关于不使用'PropertyOrField':这不是真正的优化。更像是为了我自己的理智。 – 2013-03-08 16:17:54
啊,如果是这样的话,那么为什么不写一个带有'MemberInfo'和分支的小助手呢? – Ani 2013-03-08 16:20:51