我最近一直在尝试动态构建表达式树,发现了这个看起来有点奇怪的方法。一开始我以为“哦,很棒,这正是我需要的”,因为我经常编写类似下面的代码:
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
的实例呢?我找不到使用此方法的任何示例。
Expression.New()
会有一个重载方法来接收它。我没想到可能是完全不同的调用方式。 - Ilia GPropertyOrField
:那并不是真正的优化,更像是为了我的心理健康。 - Ilia GMemberInfo
并根据需要进行分支呢? - AniExpression.MakeMemberAccess
,它恰好做我需要的事情... 羞愧地低下头 - Ilia G