我需要知道 Type
是否实现了接口(interface)。
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) 不是什么
根据性能,什么是更好的选择?
更新:我发现使用它可能会更好:
Not typeAsm.GetInterface(GetType(Rule.IRule).FullName) Is Nothing
代替
GetType(Rule.IRule).IsAssignableFrom(typeAsm)
因为接口(interface) IRule 本身是可分配给 IRule 的,如果我尝试创建一个实例,它会引发 MissingMethodExcpetion:
ruleObj = CType(Activator.CreateInstance(typeAsm, True), Rule.IRule)
更新 2: 感谢本·沃伊特。他说服我,IsAssignableFrom 与 IsAbstract 的结合可能是检查给定类型是否实现接口(interface)以及不是接口(interface)本身的最佳方法(如果您尝试创建实例,会抛出 MissingMethodException)。
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then
最佳答案
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# 中的“is”的工作方式相同。
但是,在您的示例中,它试图查看是否 System.Type
(或实际使用的任何子类)实现 Rule.IRule
.那不会工作...因为你对是否System.Type
不感兴趣实现接口(interface),您感兴趣的是 System.Type
的实例那typeAsm
变量指的是工具IRule.Rule
.
换句话说,您的代码在 C# 中也不会运行得更好。你需要 Type.IsAssignableFrom
在谈论 System.Type
的实例时:
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then
关于c# - 如何查看一个类型是否实现了一个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015761/