Tim*_*ter 6 c# vb.net inheritance typechecking
我需要知道是否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
Run Code Online (Sandbox Code Playgroud)
谢谢大家.现在我知道为什么typeof不起作用.该类型自然不实现IRule.我从你的答案中筛选出两个选项:
GetType(Rule.IRule).IsAssignableFrom(typeAsm)
typeAsm.GetInterface(GetType(Rule.IRule).FullName) IsNot Nothing
根据表现选择更好的是什么?
更新:我发现使用它可能更好:
Not typeAsm.GetInterface(GetType(Rule.IRule).FullName) Is Nothing
Run Code Online (Sandbox Code Playgroud)
代替
GetType(Rule.IRule).IsAssignableFrom(typeAsm)
Run Code Online (Sandbox Code Playgroud)
因为如果我尝试创建一个实例,接口IRule本身可以赋予IRule,它会引发MissingMethodExcpetion:
ruleObj = CType(Activator.CreateInstance(typeAsm, True), Rule.IRule)
Run Code Online (Sandbox Code Playgroud)
更新2: 感谢Ben Voigt.他说服IsAssignableFrom与IsAbstract结合使用可能是检查给定类型是否实现接口而不是接口本身的最佳方法(如果您尝试创建实例,则会抛出MissingMethodException).
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)
这与C#中的"is"的工作方式相同.
但是,在您的示例中,那是试图查看System.Type
(或实际使用的子类)是否实现Rule.IRule
.这将不工作...因为你不感兴趣,是否System.Type
实现了接口,你感兴趣的是否实例中System.Type
的typeAsm
变量是指器具IRule.Rule
.
换句话说,你的代码在C#中也不会有更好的效果.Type.IsAssignableFrom
在谈论以下实例时,您需要System.Type
:
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then
Run Code Online (Sandbox Code Playgroud)
在C#中:
x is Class1
Run Code Online (Sandbox Code Playgroud)
在VB.NET中:
TypeOf x Is Class1
Run Code Online (Sandbox Code Playgroud)