为什么通用参数输出T的IsGenericParameter为false

时间:2013-09-13 13:29:52

标签: c# generics reflection

我有一个像这样定义的方法:

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()的结果来找到正确的方法。

1 个答案:

答案 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