gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:09:49 27 4
gpt4 key购买 nike

所以我最近一直在玩动态构建表达式树,并遇到了这个方法,这看起来有点奇怪。起初,我不断按照

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 的实例?我找不到使用此方法的任何示例。

最佳答案

对象初始化表达式

假设您有:

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 有什么用。

关于c# - Expression.Bind() - 它实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15297964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com