在创建表达式树时,Expression.Call方法的typeArguments参数是什么?

时间:2014-01-08 21:23:31

标签: c# linq expression-trees

目前我正在尝试使用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参数的一般解释?提前谢谢。

2 个答案:

答案 0 :(得分:3)

typeArguments参数用于调用泛型方法而不提供MethodInfo。请考虑以下函数:

public void NonGenericMethod() 
{
}

public void GenericMethod<T>()
{
}

public void GenericMethod2<T1, T2>()
{
}

对于NonGenericMethodtypeArguments应为空数组(使用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参数。