将泛型 T 的类型解析为 C# 中的特定接口

Posted

技术标签:

【中文标题】将泛型 T 的类型解析为 C# 中的特定接口【英文标题】:Resolve type of generic T to a specific interface in C# 【发布时间】:2014-11-03 00:20:16 【问题描述】:

我想在运行时找到泛型 T 的类型并进行比较以检查它是哪个接口。

因此,这适用于在运行时查找 T 的类型:

Type interfaceName = typeof(T); // gives me the specific interface type

但是当我尝试检查它是否等于接口的类型时,我没有得到预期的响应。

Type.GetType("IMyInterface"); //this returns null

如何比较这两者?

【问题讨论】:

看看:***.com/questions/4963160/… @TryingToImprove 这不是我想要的。此外,我不想在这部分代码中使用反射。 【参考方案1】:

可能是这样的:

typeof(T).Name == "IMyInterface"

【讨论】:

【参考方案2】:

如果你想使用Type.GetType,你需要传递assembly-qualified name。

但是,看起来你只是想检查一个接口的名称,所以你可以简单地使用

Type interfaceType = typeof(T);
string interfaceName = interfaceType.Name;

你也可以简单地检查一下typeof(T) == typeof(IMyInterface)

【讨论】:

“只需检查 typeof(T) == typeof(IMyInterface)”本身是否就是正确答案。 如果其他地方有同名的接口,第一种解决方案会导致误报。如果类型是实现或扩展接口的某种类型,则第二种解决方案不会通过。 @Servy Fair 指出第一个解决方案,这是对原始帖子的直接修复。但关于第二个问题,问题指出 “我想在运行时找到泛型 T 的类型并进行比较以检查 它是哪个接口。” - 不是它实现或扩展的接口。 @AlexG 你认为他真的是那个意思吗,或者你认为他不知道正确的术语来解释他真正想要什么? @Servy 我不想知道;如果是这种情况,那么问题可以作为 TryingToImprove 链接的问题的副本关闭【参考方案3】:

GetType 方法需要一个完全限定名称。所以你需要:

Type.GetType("YourNamespace.IMyInterface"); 

或者,如果您引用了声明 IMyInterface 的程序集,那么只需 typeof(IMyInterface) 即可完成这项工作。

【讨论】:

以上是关于将泛型 T 的类型解析为 C# 中的特定接口的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 允许将泛型数组与所有类型的模式进行匹配?

当两个类型参数在C#中实现公共接口时,如何将泛型强制转换为它实现的接口

C# where用法解析

将泛型类型转换为具体类型时出错

接口中的C#泛型,编写泛型算法

Java 将泛型类型与 Void 进行比较