如何确定ParameterInfo是否是泛型类型?

时间:2011-01-19 17:56:03

标签: c# generics reflection methodinfo parameterinfo

我有一个GenericMethodDefinition MethodInfo。例如:CallMethod<T>(T arg, string arg2)。 GetParameters()方法将为我提供两个ParameterInfo对象,第一个是通用的,第二个不是。如何让ParameterInfo告诉我它是通用的?如果它有约束怎么办?

4 个答案:

答案 0 :(得分:7)

检查ParameterType.IsGenericParameter
您可能还想查看ContainsGenericParametersMyMethod<T>(List<T> param)之类的内容也是如此。 (即使List<>不是通用参数)

如果IsGenericParameter为真,您也可以调用GetGenericParameterConstraints()来获取接口或基类型约束,并且可以检查GenericParameterAttributes[Flags]枚举)以获取new() 1}},structclass约束。

答案 1 :(得分:3)

我认为你正在寻找这些:

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

答案 2 :(得分:2)

除了其他人对第二个问题的回答:是的,我们可以使用ParameterInfoGetGenericParameterConstraints()获取约束,但它并不适用于所有情况。考虑一下这样的通用方法:

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

答案 3 :(得分:1)

也许here 您会找到有关反映通用参数的信息......