将新对象指定给类属性C#表达式树
如何使用表达式树指定以下语句 myFoo.myBar=新条() 我的代码如下:将新对象指定给类属性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));
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);