我需要知道一个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)
更新2: 感谢Ben Voigt的建议。他让我相信,结合IsAbstract使用IsAssignableFrom可能是检查给定类型是否实现了一个接口且不是接口本身(如果您尝试创建一个实例,会抛出MissingMethodException)的最佳方法。
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then
is
关键字在这里无法使用。 - SLaksSystem.Type
类没有实现IRule
接口。请看我的回答。 - SLaks