Ili*_*a G 16 .net c# reflection expression expression-trees
所以我最近一直在玩动态构建表达式树,并遇到了这种方法,这看起来有点奇怪.起初,在经常编写代码之后,我认为"哦,这正是我需要的"
var left = member is FieldInfo ? Expression.Field(instance, (FieldInfo)member) : Expression.Property(instance, (PropertyInfo)member);
var right = ...
var assign = Expression.Assign(left, right);
Run Code Online (Sandbox Code Playgroud)
是的,我知道有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;
}
Run Code Online (Sandbox Code Playgroud)
它产生MemberAssignment表达Bar = "".但是没有实例也没有静态引用.我如何将这个表达式应用于和实例Foo?我找不到任何使用此方法的示例.
Ani*_*Ani 15
对象初始化表达式.
假设你有:
public class Foo
{
public int Property { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
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);
Run Code Online (Sandbox Code Playgroud)
这是这样的:
i => new Foo { Property = i }
Run Code Online (Sandbox Code Playgroud)
我不能帮你解决"性能问题"你是下决心解决(将使用Expression.PropertyOrField真正在应用程序中引入的一个瓶颈,我有点怀疑过早优化之前,您应该确定这个?) (编辑:原谅.错误地假设这是一个性能优化,并且正如您自己发现的那样,Expression.MakeMemberAccess就是您所需要的),但我可以告诉您什么Expression.Bind是有用的.