获取返回值接口后面的Type

时间:2016-04-06 08:27:38

标签: c# interface

给出这个小例子代码:

class Program
{

    static void Main(string[] args)
    {
        var testInstance = new TestClass();
        Func<TestClass, IComparable> testFunction = (test => test.DoubleProperty);
        var functionType = testFunction.GetType();                       // "Func`2"
        var returnType = testFunction.Method.ReturnType;                 // IComparable
        var typeOfReturnType = testFunction.Method.ReturnType.GetType(); // RuntimeType
    }
}

class TestClass
{
    public int IntProperty { get; set; }

    public double DoubleProperty { get; set; }
}

我希望IComparable后面的类型应该是double

testFunction.GetType();将返回 Func'2 对我来说很清楚。

IComparable的返回testFunction.Method.ReturnType;也很明确,具有我期望的价值。

但是,如果不调用方法double,是否可以获得原始返回类型testFunction

1 个答案:

答案 0 :(得分:3)

在写完我的评论之后,我意识到它比解释IL要复杂一点,而且在所有情况下它都不是肯定

考虑一下这个功能:

Func<TestClass, IComparable> testFunction = test => {
    if (rand.Next(0,2) == 1)
        return new Implementation1();
    else 
        return new Implementation2();
}

没有办法提前确定要返回哪个实现。

然而 - 此适用于使用Expression

简短的回答是:'不',除非你的方法在编译时是众所周知的(也就是说,你知道它只会返回一个具体的类型)。即便如此,这也有点棘手。

在您的情况下,如果我们知道表达式只是MemberExpression(在这种情况下,转换为IComparable),就有可能。

假设您按如下方式定义了表达式:

Expression<Func<TestClass, IComparable>> testFunction = (test => test.DoubleProperty);

然后你可以用这个获得返回类型:

((testFunction.Body as UnaryExpression).Operand as MemberExpression).Type