目前我正在尝试使用MethodCallExpressions为When,Select和GroupBy制作表达式树。我从this manual on MSDN和StackOverflow上的几个帖子开始。这为我们提供了很好的入门示例。为了能够编写我自己的表达式树,没有示例,我觉得有必要使用如下参数来理解Expression.Call方法:
public static MethodCallExpression Call(
Expression instance,
string methodName,
Type[] typeArguments,
params Expression[] arguments
)
第三个参数是described by Microsoft,如下所示:
一个Type对象数组,用于指定泛型方法的类型参数。当methodName指定非泛型方法时,此参数应为null。
这听起来相当普遍,我无法找到如何定义我应该通过Expression.Call方法调用传递的类型。
谁能帮我解释一下typeArguments参数的一般解释?提前谢谢。
答案 0 :(得分:3)
typeArguments
参数用于调用泛型方法而不提供MethodInfo
。请考虑以下函数:
public void NonGenericMethod()
{
}
public void GenericMethod<T>()
{
}
public void GenericMethod2<T1, T2>()
{
}
对于NonGenericMethod
,typeArguments
应为空数组(使用Type.EmptyTypes
)。 GenericMethod<T>
有 1类型参数:typeArguments
应该是一个包含Type
的数组(如果您想调用GenericMethod<int>
,它将是{ {1}})。 new [] { typeof(int) }
有 2个类型参数:GenericMethod2<T1, T2>
数组应该有两个元素(typeArguments
将是GenericMethod2<int, int>
)。等等。
答案 1 :(得分:1)
generic method是一种具有一个或多个类型参数的方法。您可以创建一个通用方法,以便在各种类型上应用算法。例如:
public T DoSomething<T>(T input)
{
return T; // do something useful
}
您可以这样调用此方法:
var result = DoSomething<int>(123);
要调用泛型方法,必须指定Type参数。因此,您在Expression.Call方法中使用typeArguments参数。