【问题标题】:How to determine if ParameterInfo is of generic type?如何确定 ParameterInfo 是否为泛型类型?
【发布时间】:2011-06-11 22:47:00
【问题描述】:

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

【问题讨论】:

  • 感谢模组创建 parameterinfo 标签

标签: c# generics reflection methodinfo parameterinfo


【解决方案1】:

除了其他人对第二个问题的回答:是的,我们可以使用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

【讨论】:

    【解决方案2】:

    检查ParameterType.IsGenericParameter
    您可能还想检查ContainsGenericParameters,这对于MyMethod&lt;T&gt;(List&lt;T&gt; param) 之类的东西是正确的。 (尽管List&lt;&gt; 不是通用参数)

    如果IsGenericParameter 为真,您还可以调用GetGenericParameterConstraints() 来获取接口或基类型约束,并且您可以检查GenericParameterAttributes[Flags] 枚举)中的new()struct 或@ 987654331@ 约束。

    【讨论】:

    • 泛型参数约束怎么样?
    • 如果argsT[] 的数组,则可以使用ParameterType.IsArrayParameterType.ContainsGenericParameter
    【解决方案3】:

    我认为您正在寻找这些:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 2023-03-26
        相关资源
        最近更新 更多