给出这个小例子代码:
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
?
答案 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