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

前端之家收集整理的这篇文章主要介绍了c# – 如何查看类型是否实现了接口?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要知道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.我从你的答案中筛选出两个选项:

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

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

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

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

解决方法

TypeOf …继承可以正常工作:
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是否实现接口不感兴趣,您对typeAsm变量引用的System.Type实例是否实现IRule.Rule感兴趣.

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

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

猜你在找的C#相关文章