我需要知道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多亏了所有人。现在我知道为什么类型不起作用了。该类型自然不实现IRule。我从你的回答中筛选出两个选项:
GetType(Rule.IRule).IsAssignableFrom(typeAsm)typeAsm.GetInterface(GetType(Rule.IRule).FullName) IsNot Nothing什么是更好的选择,根据表现?
UPDATE:我发现最好使用:
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,。他让我相信,IsAssignableFrom与IsAbstract相结合可能是检查给定类型是否实现接口的最佳方法,而并不是接口本身的(如果尝试创建实例,则会抛出MissingMethodException )。
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then发布于 2010-10-25 14:56:21
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是否实现接口不感兴趣,所以您感兴趣的是typeAsm变量所引用的System.Type实例是否实现了IRule.Rule。
换句话说,您的代码在C#中也不会运行得更好。在讨论Type.IsAssignableFrom实例时需要使用System.Type
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then发布于 2010-10-25 14:55:49
在C#中:
x is Class1 在VB.NET中:
TypeOf x Is Class1在这里描述。
发布于 2010-10-25 14:55:47
另一种选择:
If myType.GetInterface("Rule.IRule") IsNot Nothing Thenhttp://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx
https://stackoverflow.com/questions/4015761
复制相似问题