我有一个像这样定义的方法:
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()
的结果来找到正确的方法。
答案 0 :(得分:13)
参数类型不是T
,而是IL和Reflection调用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);
}
}
输出:
parameter.ParameterType.IsGenericParameter: False parameter.ParameterType.IsByRef: True parameter.ParameterType.GetElementType().IsGenericParameter: True