Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将新对象指定给类属性C#表达式树_C#_Lambda_Linq Expressions - Fatal编程技术网

将新对象指定给类属性C#表达式树

将新对象指定给类属性C#表达式树,c#,lambda,linq-expressions,C#,Lambda,Linq Expressions,如何使用表达式树指定以下语句 myFoo.myBar=新条() 我的代码如下: public static Action<TObject, TProperty>CreateNewObjectAndSet<TObject,TProperty>(string propertyName) { ParameterExpression paramExpression = Expression.Parameter(typeof(TObject));

如何使用表达式树指定以下语句

myFoo.myBar=新条()

我的代码如下:

    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;
    }
公共静态操作CreateNewObjectAndSet(字符串propertyName)
{
ParameterExpression ParameterExpression=Expression.Parameter(typeof(TObject));
MemberExpression propertyGetterExpression=Expression.Property(参数表达式,propertyName);
var newObject=Expression.New(typeof(TProperty));
var x=表达式.Assign(propertyGetterExpression,newObject);
var parametexpressions=新的parametexpression[2];
paramExpressions[0]=paramExpression;
参数表达式[1]=新对象;
Action result=Expression.Lambda(x,paramExpressions.Compile();
返回结果;
}
语句处发生编译错误

ParameterExpression[1]=新对象


因为目标表达式是:

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);
公共静态操作CreateNewObjectAndSet(string propertyName),其中tpProperty:new(){
ParameterExpression ParameterExpression=Expression.Parameter(typeof(TObject));
MemberExpression propertyGetterExpression=Expression.Property(参数表达式,propertyName);
var newObject=Expression.New(typeof(TProperty));
var x=表达式.Assign(propertyGetterExpression,newObject);
var parametexpressions=新的parametexpression[1];
paramExpressions[0]=paramExpression;
Action result=Expression.Lambda(x,paramExpressions.Compile();
返回结果;
}
然后这样称呼:

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);
var setter=CreateNewObjectAndSet(“myBar”);
塞特(myFoo);