I need to know if a Type implements an 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
Thanks to all. Now i know why typeof didn't work. The type naturally does not implement IRule. I have filtered out two options from your answers:
GetType(Rule.IRule).IsAssignableFrom(typeAsm)typeAsm.GetInterface(GetType(Rule.IRule).FullName) IsNot NothingWhat is the better choise according to performance?
UPDATE: i've found out that it might be better to use:
Not typeAsm.GetInterface(GetType(Rule.IRule).FullName) Is Nothing
instead of
GetType(Rule.IRule).IsAssignableFrom(typeAsm)
because the Interface IRule itself is assignable of IRule what raises a MissingMethodExcpetion if i try to create an instance:
ruleObj = CType(Activator.CreateInstance(typeAsm, True), Rule.IRule)
UPDATE2: Thanks to Ben Voigt. He convinced me that IsAssignableFrom in combination with IsAbstract might be the best way to check if a given type implements an interface and is not the interface itself (what throws a MissingMethodException if you try to create an instance).
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then
TypeOf ... Is works fine with inheritance:
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
That works the same way as "is" in C#.
However, in your example, that's trying to see whether System.Type (or whatever subclass is actually used) implements Rule.IRule. That won't work... because you're not interested in whether System.Type implements the interface, you're interested in whether the instance of System.Type that the typeAsm variable refers to implements IRule.Rule.
In other words, your code wouldn't have worked any better in C# either. You need Type.IsAssignableFrom when talking about an instance of System.Type:
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With