8

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

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().

4

1 回答 1

13

参数类型不是T,它是 IL 和 Reflection 调用的T&( ref T)。IsGenericParameterreturn是正确的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:真
参数.ParameterType.GetElementType().IsGenericParameter: True
于 2013-09-13T13:55:13.017 回答