为什么 IsGenericParameter 对于泛型参数 out T 为假

本文关键字:参数 out 为假 泛型 IsGenericParameter 于泛型 为什么 | 更新日期: 2023-09-27 18:31:08

我有一个定义如下的方法:

public bool TryGetProperty<T>(string name, out T value)

查看此方法的MethodInfo,我发现

methodInfo.GetParameters()[1].ParameterType.IsGenericParameter

false. 我希望它是true的,因为第二个参数的类型为 T 。 (另一方面,methodInfo.GetParameters()[1].ParameterType.ContainsGenericParameterstrue

为什么在这种情况下IsGenericParameter是错误的? 验证第二个参数是否具有T类型的正确方法是什么. 例如,我试图通过过滤Type.GetMethods()的结果来找到正确的方法。

为什么 IsGenericParameter 对于泛型参数 out T 为假

参数

类型不是T,而是IL和反射T&ref T)所称呼的参数类型。正确的是,IsGenericParameter返回false:对于by-ref类型,您首先必须获取所引用的类型。

using System;
using System.Collections.Generic;
class TestClass
{
    public void TestMethod<T>(out T something)
    {
        something = default(T);
    }
}
static class Program
{
    static void Main()
    {
        var method = typeof(TestClass).GetMethod("TestMethod");
        var parameter = method.GetParameters()[0];
        Console.WriteLine("parameter.ParameterType.IsGenericParameter: " + parameter.ParameterType.IsGenericParameter);
        Console.WriteLine("parameter.ParameterType.IsByRef: " + parameter.ParameterType.IsByRef);
        Console.WriteLine("parameter.ParameterType.GetElementType().IsGenericParameter: " + parameter.ParameterType.GetElementType().IsGenericParameter);
    }
}

输出:

参数。ParameterType.IsGenericParameter: False参数。ParameterType.IsByRef: True参数。ParameterType.GetElementType().IsGenericParameter: True