为什么 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.ContainsGenericParameters
是true
。
为什么在这种情况下IsGenericParameter
是错误的? 验证第二个参数是否具有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);
}
}
输出:
参数。ParameterType.IsGenericParameter: False参数。ParameterType.IsByRef: True参数。ParameterType.GetElementType().IsGenericParameter: True