为什么参数化泛型接口的GetMethods()返回一个非参数化的MethodInfo ?

本文关键字:参数 一个 MethodInfo 返回 GetMethods 为什么 泛型接口 | 更新日期: 2023-09-27 17:54:19

给定这些接口:

public interface IGenericBase<T>
{
    T MyMethod<T>(T arg1);
}
public interface IGenericDescendant : IGenericBase<int>
{
}

使用igenericdescendants的类型,我通过GetInterfaces()获得接口集。正如预期的那样,这将返回一个"已解析"(参数化)类型:genericbase ' 1,其中T解析为Int32。然后,我在该接口类型上调用GetMethods,期望得到类似的MyMethod解析版本,但我得到的是泛型版本,其中T是一个未解析的类型参数。

var type = typeof(IGenericDescendant);    
foreach (var super in type.GetInterfaces())
{
    foreach (var member in super.GetMethods())
    {
        yield return member;  // Get MyMethod<T> not MyMethod<Int32>
    }
}

根据微软的文档,这不是GetMethods()的正确行为:

如果当前T:System。Type表示构造的泛型类型,这个方法返回带有类型参数的MethodInfo对象由适当的类型参数

替换
不幸的是,当涉及到类型解析的泛型接口时,情况似乎并非如此。

作为一种变通方法,我可以使用MakeGenericType()来解析类型参数,但是我必须知道类型,这意味着我实际上必须通过遍历层次结构来通过名称自己解析类型参数。对于这个具体的例子来说很简单,但是我需要一个通解。

为什么参数化泛型接口的GetMethods()返回一个非参数化的MethodInfo ?

MyMethod是在泛型接口中声明的泛型方法。如果为泛型类型指定参数,它仍然是一个泛型方法。例如:

IGenericDescendant x = new SomeImplementation();
x.MyMethod<string>("abc"); // method is still generic
IGenericBase<int> y = new SomeOtherImplementation();
y.MyMethod<string>("abc"); // still can do that

您可能想要将接口声明为

public interface IGenericBase<T>
{
    T MyMethod(T arg1);
}