c# - 如何查看一个类型是否实现了一个接口(interface)?

标签 c# vb.net inheritance typechecking

我需要知道 Type 是否实现了接口(interface)。

 Dim asmRule As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Rule.dll"))

 For Each typeAsm As System.Type In asmRule.GetTypes
     If TypeOf typeAsm Is Rule.IRule Then
       'that does always return false even though they implement IRule'
     End If
 Next

感谢大家。现在我知道为什么 typeof 不起作用了。该类型自然不会实现 IRule。我从你的回答中过滤掉了两个选项:

  1. GetType(Rule.IRule).IsAssignableFrom(typeAsm)
  2. typeAsm.GetInterface(GetType(Rule.IRule).FullName) 不是什么

根据性能,什么是更好的选择?

更新:我发现使用它可能会更好:

Not typeAsm.GetInterface(GetType(Rule.IRule).FullName) Is Nothing

代替

GetType(Rule.IRule).IsAssignableFrom(typeAsm)

因为接口(interface) IRule 本身是可分配给 IRule 的,如果我尝试创建一个实例,它会引发 MissingMethodExcpetion:

ruleObj = CType(Activator.CreateInstance(typeAsm, True), Rule.IRule)

更新 2: 感谢本·沃伊特。他说服我,IsAssignableFrom 与 IsAbstract 的结合可能是检查给定类型是否实现接口(interface)以及不是接口(interface)本身的最佳方法(如果您尝试创建实例,会抛出 MissingMethodException)。

If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then

最佳答案

TypeOf ... Is适用于继承:

Imports System

Public Class Test

    Public Shared Sub Main()
        Dim o As Object = 5

        If TypeOf o Is IFormattable Then
            Console.WriteLine("Yes")
        End If
    End Sub    

End Class

这与 C# 中的“is”的工作方式相同。

但是,在您的示例中,它试图查看是否 System.Type (或实际使用的任何子类)实现 Rule.IRule .那不会工作...因为你对是否System.Type不感兴趣实现接口(interface),您感兴趣的是 System.Type实例typeAsm变量指的是工具IRule.Rule .

换句话说,您的代码在 C# 中也不会运行得更好。你需要 Type.IsAssignableFrom 在谈论 System.Type 的实例时:

If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then

关于c# - 如何查看一个类型是否实现了一个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015761/

相关文章:

c# - 来自 SqlDataReader 的可空小数

c# - 静态锁是否适用于不同的子类?

c# - 继承链中类的良好命名约定是什么?

c# - 无法访问的代码和验证

c# - 返回 HelpText 类而不是字符串会意外地起作用

mysql - vb.net 插入查询

.net - Visual Studio 2003 的 VARCHAR(MAX) SqlParameter 输出大小

vb.net - 无法找到程序集 A_class,版本 2.0.0.0,Culture=neutral,PublicKeyToken=null

python - 为什么 Python 类会继承对象?

c# - 将数据表中选定的列绑定(bind)到数据网格中