我有一个插件架构,需要检测实现任何类型的接口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扩展)。