加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:23:45 所属栏目:百科 来源:网络整理
导读:我需要知道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
我需要知道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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读