我有一个GenericMethodDefinition的MethodInfo
,例如:CallMethod<T>(T arg, string arg2)
。调用GetParameters()方法将给我两个ParameterInfo对象,第一个是泛型的,第二个不是。如何让ParameterInfo告诉我它是泛型的?如果有约束条件呢?
我有一个GenericMethodDefinition的MethodInfo
,例如:CallMethod<T>(T arg, string arg2)
。调用GetParameters()方法将给我两个ParameterInfo对象,第一个是泛型的,第二个不是。如何让ParameterInfo告诉我它是泛型的?如果有约束条件呢?
请检查ParameterType.IsGenericParameter
。
您可能还想检查ContainsGenericParameters
,对于像MyMethod<T>(List<T> param)
这样的内容会返回true。 (即使List<>
不是泛型参数)
如果IsGenericParameter
为true,则还可以调用GetGenericParameterConstraints()
以获取接口或基类型约束,并且可以检查GenericParameterAttributes
(一个[Flags]
枚举)以获取new()
,struct
或class
约束。
args
是一个 T[]
数组,可以使用 ParameterType.IsArray
和 ParameterType.ContainsGenericParameter
。 - user492238我想你在寻找这些内容:
parameterInfo.ParameterType.ContainsGenericParameters
parameterInfo.ParameterType.GetGenericParameterConstraints()
除了其他人对第二个问题的回答之外:是的,我们可以使用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