将新对象分配给 class 属性 C# 表达式树

Assign new object to class property C# Expression Tree

如何使用表达式 Tree

分配以下语句

myFoo.myBar = new Bar();

我的代码如下 -

    public static Action<TObject, TProperty>CreateNewObjectAndSet<TObject,TProperty>(string propertyName)
    {

        ParameterExpression paramExpression = Expression.Parameter(typeof(TObject));
        MemberExpression propertyGetterExpression = Expression.Property(paramExpression, propertyName);

        var newObject = Expression.New(typeof(TProperty));

        var x = Expression.Assign(propertyGetterExpression, newObject);

        var paramExpressions = new ParameterExpression[2];
        paramExpressions[0] = paramExpression;
        paramExpressions[1] = newObject;

        Action<TObject, TProperty> result = Expression.Lambda<Action<TObject, TProperty>>(x, paramExpressions).Compile();

        return result;
    }

语句出现编译错误

paramExpression[1] = newObject;

因为目标表达式是:

myFoo.myBar = new Bar();

你不需要 2 个参数,你只需要 1 - myFoo 的实例来设置 属性。所以像这样更改您的代码:

public static Action<TObject> CreateNewObjectAndSet<TObject, TProperty>(string propertyName) where TProperty: new() {

    ParameterExpression paramExpression = Expression.Parameter(typeof(TObject));
    MemberExpression propertyGetterExpression = Expression.Property(paramExpression, propertyName);

    var newObject = Expression.New(typeof(TProperty));

    var x = Expression.Assign(propertyGetterExpression, newObject);

    var paramExpressions = new ParameterExpression[1];
    paramExpressions[0] = paramExpression;

    Action<TObject> result = Expression.Lambda<Action<TObject>>(x, paramExpressions).Compile();

    return result;
}

然后这样调用:

var setter = CreateNewObjectAndSet<Foo, Bar>("myBar");
setter(myFoo);