我有一个插件架构,需要检测实现任何类型的接口ISurface<T>的所有插件(即测试ISurface<>)。我看到这里有一些使用LINQ的建议(例如this one),我想知道是否有理由对此表示支持:

.GetType().GetInterface("ISurface`1")


编辑:关于对接口名称进行硬编码,我假设如果直接从实际接口中提取名称,这些担忧将得到缓解,正如Tim在下面也提到的那样:

.GetType().GetInterface(typeof(ISurface<>).FullName)


使用.FullName,名称空间的歧义也应该没有问题。除了硬编码,我主要对方法本身感兴趣,因为它比经过一系列类型属性检查/ LINQ语法更短,更简洁。再说一次,我不知道幕后到底发生了什么。

最佳答案

这是提取所有受支持类型为ISurface<anything>的接口的方法:

void Main()
{
    var supportedInterfaces =
        from intf in typeof(Test).GetInterfaces()
        where intf.IsGenericType
        let genericIntf = intf.GetGenericTypeDefinition()
        where genericIntf == typeof(ISurface<>)
        select intf;

    supportedInterfaces.Dump();
}

public class Test : ISurface<int>
{
}

public interface ISurface<T>
{
}


您可以在LINQPad中进行测试(.Dump()扩展方法是LINQPad扩展)。

10-08 13:42