从Expression <Func <T,object >>实例获取实际返回类型

Set*_*son 12 c# reflection expression-trees

我有一个接受Expression<Func<T, object>>实例的方法.我想得到特定表达式实例返回的实际数据类型,而不是object.

我可以让它用于直接属性引用,所以如果我传入表达式,x => x.IntegerProperty我可以得到一个整数的类型引用.此方法需要将其转换为MemberExpression.

但是,我不能让它为任意表达式工作.例如,如果表达式是x => x.IntegerProperty.ToString()我想获得字符串的Type引用.我无法将其编译为MemberExpression,如果我只是.Compile()检查返回类型,我会得到"对象".

如何查看特定的表达式实例并派生实际的返回类型?

Luk*_*keH 23

像这样的东西可能会成功.它可能并未涵盖所有可能性,但它是一个开始.

public static Type GetObjectType<T>(Expression<Func<T, object>> expr)
{
    if ((expr.Body.NodeType == ExpressionType.Convert) ||
        (expr.Body.NodeType == ExpressionType.ConvertChecked))
    {
        var unary = expr.Body as UnaryExpression;
        if (unary != null)
            return unary.Operand.Type;
    }
    return expr.Body.Type;
}
Run Code Online (Sandbox Code Playgroud)