我需要知道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