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