C# 为什么泛型参数out T的IsGenericParameter为false

C# 为什么泛型参数out T的IsGenericParameter为false,c#,generics,reflection,C#,Generics,Reflection,我有一个定义如下的方法: public bool TryGetProperty<T>(string name, out T value) 是false。我希望它是true,因为第二个参数的类型是T。(另一方面,methodInfo.GetParameters()[1]。ParameterType.ContainsGenericParameters为true) 在这种情况下,IsGenericParameter为什么为false?验证第二个参数的类型为T的正确方法是什么。例如,我试图

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

public bool TryGetProperty<T>(string name, out T value)
false
。我希望它是
true
,因为第二个参数的类型是
T
。(另一方面,
methodInfo.GetParameters()[1]。ParameterType.ContainsGenericParameters
true


在这种情况下,
IsGenericParameter
为什么为false?验证第二个参数的类型为
T
的正确方法是什么。例如,我试图通过过滤
Type.GetMethods()

的结果来找到正确的方法。参数类型不是
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);
    }
}
使用系统;
使用System.Collections.Generic;
类TestClass
{
公共void测试方法(out T something)
{
某物=默认值(T);
}
}
静态类程序
{
静态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);
}
}
输出:

parameter.ParameterType.IsGenericParameter: False parameter.ParameterType.IsByRef: True parameter.ParameterType.GetElementType().IsGenericParameter: True parameter.ParameterType.IsGenericParameter:False parameter.ParameterType.IsByRef:True parameter.ParameterType.GetElementType().IsGenericParameter:True
出于好奇,methodInfo.GetParameters()[1].ParameterType.IsGenericType的结果是什么?@jbl,在C#术语中也是
false
,参数类型是
T
,但对于IL,它不是,它是
ref T
ref
是类型的一部分)使用自定义属性
Out
。尝试删除Out,然后再试一次,结果如何告诉我!这正是我需要知道的。 parameter.ParameterType.IsGenericParameter: False parameter.ParameterType.IsByRef: True parameter.ParameterType.GetElementType().IsGenericParameter: True