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

public bool TryGetProperty<T>(string name, out T value)

查看此方法的MethodInfo,我发现
methodInfo.GetParameters()[1].ParameterType.IsGenericParameter

false。我希望它是true,因为第二个参数具有T的类型。 (另一方面,methodInfo.GetParameters()[1].ParameterType.ContainsGenericParameterstrue。)

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

最佳答案

参数类型不是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

10-01 05:59
查看更多