我正在构建一个基于表达式的小型属性分配器。
这个想法非常简单,只需创建一个获取对象属性并将其分配给另一个对象属性的Action。
所以如果我处理这个表达式:
public static Action PropertyAssign(object sourceObject, object destObject,
PropertyInfo sourceProperty, PropertyInfo destProperty)
{
Expression source = Expression.PropertyOrField(
Expression.Constant(sourceObject), sourceProperty.Name);
Expression dest = Expression.PropertyOrField(
Expression.Constant(destObject), destProperty.Name);
Expression assign = Expression.Assign(dest, source);
return (Action)Expression.Lambda(assign).Compile();
}
并尝试调用它,我得到一个异常,告诉Expression.Lambda是Func类型(其中T是属性类型)
由于我调用assign,我希望堆栈上没有剩余值(所以不返回属性本身)。
现在如果我使用SetMethod分配属性,例如:
public static Action PropertyAssign(object sourceObject, object destObject, PropertyInfo sourceProperty, PropertyInfo destProperty)
{
Expression source = Expression.PropertyOrField(
Expression.Constant(sourceObject), sourceProperty.Name);
Expression dest = Expression.PropertyOrField(
Expression.Constant(destObject), destProperty.Name);
Expression assign = Expression.Call(
Expression.Constant(destObject), destProperty.SetMethod, source);
Action assigner = (Action)Expression.Lambda(assign).Compile();
return assigner;
}
在这种情况下,函数Lambda.Compile()返回一个没有参数/返回值的Action。
所以这不是阻塞问题,但我只是好奇为什么assign运算符返回一个值以及赋值属性(其中Assign也应该只是调用setter方法)。
还有一种方法可以调整第一个调用来返回一个动作而不是一个func吗?