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

7

我有一个GenericMethodDefinition的MethodInfo,例如:CallMethod<T>(T arg, string arg2)。调用GetParameters()方法将给我两个ParameterInfo对象,第一个是泛型的,第二个不是。如何让ParameterInfo告诉我它是泛型的?如果有约束条件呢?


1
感谢版主创建了 ParameterInfo 标签。 - smartcaveman
4个回答

7

请检查ParameterType.IsGenericParameter
您可能还想检查ContainsGenericParameters,对于像MyMethod<T>(List<T> param)这样的内容会返回true。 (即使List<>不是泛型参数)

如果IsGenericParameter为true,则还可以调用GetGenericParameterConstraints()以获取接口或基类型约束,并且可以检查GenericParameterAttributes(一个[Flags]枚举)以获取new()structclass约束。


泛型参数约束怎么样? - smartcaveman
如果 args 是一个 T[] 数组,可以使用 ParameterType.IsArrayParameterType.ContainsGenericParameter - user492238

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

1

也许在这里你会找到关于反射泛型参数的信息...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接