【问题标题】:Expression.Bind() - what does it actually do?Expression.Bind() - 它实际上是做什么的?
【发布时间】:2013-03-08 15:52:29
【问题描述】:

所以我最近一直在玩动态构建表达式树,遇到了这种方法,这似乎有点奇怪。起初我想“哦,这正是我需要的”在不断地按照

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

【问题讨论】:

    标签: c# .net reflection expression expression-trees


    【解决方案1】:

    对象初始化表达式。

    假设你有:

    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() 的过载能够接受这一点。我没有想到这可能是一个完全不同的电话。
    • 关于不使用PropertyOrField:这并不是真正的优化。更像是为了我自己的理智。
    • 啊,如果是这样,那为什么不写一个小助手,把MemberInfo和适当的分支呢?
    • 我有......这似乎是一个非常常见的操作,应该有一个标准的实现。
    • 还不错;为草率下结论道歉!
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 2019-10-27
    • 2012-01-08
    • 2011-03-11
    • 2010-11-26
    • 2015-06-23
    • 2017-12-26
    • 2016-10-19
    相关资源
    最近更新 更多