如何查看类型是否实现了接口?

Tim*_*ter 6 c# vb.net inheritance typechecking

我需要知道是否Type实现了一个接口.

 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
Run Code Online (Sandbox Code Playgroud)

谢谢大家.现在我知道为什么typeof不起作用.该类型自然不实现IRule.我从你的答案中筛选出两个选项:

  1. GetType(Rule.IRule).IsAssignableFrom(typeAsm)
  2. typeAsm.GetInterface(GetType(Rule.IRule).FullName) IsNot Nothing

根据表现选择更好的是什么?

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

Not typeAsm.GetInterface(GetType(Rule.IRule).FullName) Is Nothing
Run Code Online (Sandbox Code Playgroud)

代替

GetType(Rule.IRule).IsAssignableFrom(typeAsm)
Run Code Online (Sandbox Code Playgroud)

因为如果我尝试创建一个实例,接口IRule本身可以赋予IRule,它会引发MissingMethodExcpetion:

ruleObj = CType(Activator.CreateInstance(typeAsm, True), Rule.IRule)
Run Code Online (Sandbox Code Playgroud)

更新2: 感谢Ben Voigt.他说服IsAssignableFrom与IsAbstract结合使用可能是检查给定类型是否实现接口而不是接口本身的最佳方法(如果您尝试创建实例,则会抛出MissingMethodException).

If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 13

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
Run Code Online (Sandbox Code Playgroud)

这与C#中的"is"的工作方式相同.

但是,在您的示例中,那是试图查看System.Type(或实际使用的子类)是否实现Rule.IRule.这将不工作...因为你不感兴趣,是否System.Type实现了接口,你感兴趣的是否实例System.TypetypeAsm变量是指器具IRule.Rule.

换句话说,你的代码在C#中也不会有更好的效果.Type.IsAssignableFrom在谈论以下实例时,您需要System.Type:

If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then
Run Code Online (Sandbox Code Playgroud)

  • @Tim:`GetInterface`并不是更好,因为抽象类可以实现一个接口.你需要检查`IsAbstract`.尽可能使用类型cookie而不是名称也更好. (2认同)