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

时间:2010-10-25 14:51:31

标签: 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

感谢所有人。现在我知道为什么typeof不起作用。该类型自然不实现IRule。我已从您的答案中筛选出两个选项:

  1. GetType(Rule.IRule).IsAssignableFrom(typeAsm)
  2. typeAsm.GetInterface(GetType(Rule.IRule).FullName) IsNot Nothing
  3. 根据表现更好的选择是什么?

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

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

    而不是

    GetType(Rule.IRule).IsAssignableFrom(typeAsm)
    

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

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

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

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

5 个答案:

答案 0 :(得分: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

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

但是,在您的示例中,我试图查看System.Type(或实际使用的子类)是否实现Rule.IRule不会工作...因为你对System.Type是否实现接口不感兴趣,你对{{>> {{em> 1}} System.Type变量引用实现typeAsm

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

System.Type

答案 1 :(得分:5)

在C#中:

x is Class1 
VB.NET中的

TypeOf x Is Class1

Described here.

答案 2 :(得分:3)

另一种选择:

If myType.GetInterface("Rule.IRule") IsNot Nothing Then

http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx

答案 3 :(得分:3)

您使用了错误的关键字。

C#is关键字和VB.Net的TypeOf ... Is ...将检查实例是否是实现接口的类型。
因此,您的代码将检查typeAsm变量(System.Type实例)是否实现了IRule接口。 由于System.Type类未实现IRule,因此始终会返回False

您实际上是在尝试检查System.Type实例所代表的类型是否实现IRule
为此,您需要使用System.Type类中的方法。

例如:

 If typeAsm.GetInterface(GetType(Rule.IRule)) IsNot Nothing Then

答案 4 :(得分:2)