c# - 使用对象初始值设定项创建实例的表达式

标签 c# dynamic lambda expression expression-trees

有什么方法可以用表达式树的对象初始值设定项来创建对象的实例吗?我的意思是创建一个表达式树来构建这个 lambda:

// my class
public class MyObject {
    public bool DisplayValue { get; set; }
}

// my lambda:
var lambda = (Func<bool, MyObject>)
             (displayValue => new MyObject { DisplayValue = displayValue });

如何使用表达式树创建此 lambda?

更新:

我自己尝试并编写了以下代码:

    public static Func<bool, dynamic> Creator;

    static void BuildLambda() {
        var expectedType = typeof(MyObject);
        var displayValueParam = Expression.Parameter(typeof(bool), "displayValue");
        var ctor = Expression.New(expectedType);
        var local = Expression.Parameter(expectedType, "obj");
        var displayValueProperty = Expression.Property(ctor, "DisplayValue");

        var returnTarget = Expression.Label(expectedType);
        var returnExpression = Expression.Return(returnTarget,local, expectedType);
        var returnLabel = Expression.Label(returnTarget, Expression.Default(expectedType));

        var block = Expression.Block(
            new[] { local },
            Expression.Assign(local, ctor),
            Expression.Assign(displayValueProperty, displayValueParam),
            Expression.Return(Expression.Label(expectedType), local, expectedType),
            returnExpression,
            returnLabel
            );
        Creator =
            Expression.Lambda<Func<bool, dynamic>>(block, displayValueParam)
                .Compile();
    }

但它抛出以下错误:

Cannot jump to undefined label ''.

请大家帮帮我好吗?

最佳答案

要在表达式中表示对象初始值设定项,您应该使用 Expression.MemberInit() :

Expression<Func<bool, MyObject>> BuildLambda() { 
    var createdType = typeof(MyObject);
    var displayValueParam = Expression.Parameter(typeof(bool), "displayValue"); 
    var ctor = Expression.New(createdType);
    var displayValueProperty = createdType.GetProperty("DisplayValue");
    var displayValueAssignment = Expression.Bind(
        displayValueProperty, displayValueParam);
    var memberInit = Expression.MemberInit(ctor, displayValueAssignment);

    return
        Expression.Lambda<Func<bool, MyObject>>(memberInit, displayValueParam);
}

要验证这是否确实如您所愿,您可以对创建的表达式调用 ToString()。在这种情况下,输出符合预期:

displayValue => new MyObject() {DisplayValue = displayValue}

关于c# - 使用对象初始值设定项创建实例的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701737/

相关文章:

java - 如何操作java中的类

python - python中的Lambda参数函数

c# - 如何在 app.xaml 中将 datagrid SelectedIndex 设置为 -1

c# - 防止 Entity Framework 更新属性

javascript - 如何在插入元素时高效执行 JavaScript 函数?

javascript - 具有动态 ID 的目标特定元素但其他元素不相似

python - 如何使用 Pandas groupby 聚合、组合数据帧

java - 按字母升序对列表进行排序

c# - C#检测黑白图像中的多边形点

c# - 从c#.net中的JS文件访问资源文件