2014-01-08 70 views
0

目前我正在嘗試使用MethodCallExpressions爲When,Select和GroupBy創建表達式樹。我開始於this manual on MSDN和StackOverflow上的幾篇文章。這給了我們很好的入門例子。爲了能夠寫我自己的表達式樹,沒有例子,我覺得有必要了解與參數Expression.Call方法如下:製作表達式樹時,Expression.Call方法的typeArguments參數是什麼?

public static MethodCallExpression Call(
    Expression instance, 
    string methodName, 
    Type[] typeArguments, 
    params Expression[] arguments 
) 

第三個參數是described by Microsoft這樣的:

一個Type對象數組,用於指定泛型方法的類型參數。當methodName指定非泛型方法時,此參數應爲null。

這聽起來相當普遍,我不知道如何定義我應該通過我的Expression.Call方法調用哪些類型。

誰能幫我解釋一下typeArguments參數的一般說明?提前致謝。

回答

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>,它將是new [] { typeof(int) })。 GenericMethod2<T1, T2>2類型參數typeArguments數組應具有兩個元素(GenericMethod2<int, int>將爲new [] { typeof(int), typeof(int) })。等等。

+0

感謝您的幫助。我是否理解這是正確的,例如,在調用[Groupby]時傳遞源和鍵的類型(http://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby(v = vs.110).aspx)方法與Expression.Call? –

+0

@JorritSteetskamp這是正確的。您需要按順序傳遞與「TSource」和「TKey」類型對應的類型數組。 –

1

A generic method是一種具有一個或多個類型參數的方法。您可以創建一個通用方法來將算法應用於各種類型。例如:

public T DoSomething<T>(T input) 
{ 
    return T; // do something useful 
} 

您可以調用此方法是這樣的:

var result = DoSomething<int>(123); 

爲了調用一個泛型方法,你必須指定類型參數。因此,您在Expression.Call方法中使用typeArguments參數。

相關問題