2011-01-19 42 views
7

我有一個GenericMethodDefinition的MethodInfo。如:CallMethod<T>(T arg, string arg2)。 GetParameters()方法會給我兩個ParameterInfo對象,其中第一個是通用的,第二個不是。我如何獲得ParameterInfo來告訴我它是通用的?如果它有限制呢?如何確定ParameterInfo是否屬於泛型?

+1

感謝MODS的創建信息參數標籤 – smartcaveman 2011-01-19 18:11:15

回答

7

檢查ParameterType.IsGenericParameter
您可能還想檢查ContainsGenericParameters,對於像MyMethod<T>(List<T> param)這樣的情況,這將是正確的。 (即使List<>不是泛型參數)

如果IsGenericParameter是真實的,你也可以撥打GetGenericParameterConstraints()獲得的接口或基類的限制,並且可以爲new()structclass檢查GenericParameterAttributes(一[Flags]枚舉)限制。

+0

怎麼樣泛型參數的約束? – smartcaveman 2011-01-19 18:00:26

1

也許here您就會找到反映泛型參數信息...

3

我認爲你正在尋找這些:

parameterInfo.ParameterType.ContainsGenericParameters 
parameterInfo.ParameterType.GetGenericParameterConstraints() 
2

在附加別人的答案,第二個問題:是的,我們能使用GetGenericParameterConstraints()ParameterInfo獲得約束,但它不適用於所有情況。考慮這樣一些通用的方法:

public static void MyMethod<T,V>() where T : Dictionary<int, int> 
{ 
} 

有這個方法的約束,但該方法沒有參數(想想Enumerable.Cast)。我要說的是約束不是參數的一部分,而是方法本身。我們可以得到由約束:

method.GetGenericArguments()[0].BaseType //the constraint of T 
method.GetGenericArguments()[1].BaseType //that of V: Object 
相關問題