将新对象分配给 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);
如何使用表达式 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);