Expression.Assign返回Func而不是Action

时间:2015-07-14 13:46:42

标签: c# .net expression-trees

我正在构建一个基于表达式的小型属性分配器。

这个想法非常简单,只需创建一个获取对象属性并将其分配给另一个对象属性的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吗?

0 个答案:

没有答案