Как увидеть, реализует ли тип интерфейс?
мне нужно знать, если 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: Благодаря Бену Фойту. Он убедил меня, что IsAssignableFrom в сочетании с IsAbstract может быть лучшим способом проверить, реализует ли данный тип интерфейс и не сам интерфейс (что бросает MissingMethodException при попытке создать экземпляр).
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then
5 ответов
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
это работает так же, как "is" В C#.
однако, в вашем примере, это пытается увидеть, является ли System.Type
(или любой подкласс, который фактически используется) реализует Rule.IRule
. Это не работа... потому что вам не интересно, если System.Type
реализует интерфейс, вас интересует, является ли экземпляр of System.Type
что typeAsm
переменная относится к инструментам IRule.Rule
.
другими словами, ваш код также не работал бы лучше на C#. Вам нужно Type.IsAssignableFrom
когда речь идет об экземпляре System.Type
:
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then
другой вариант:
If myType.GetInterface("Rule.IRule") IsNot Nothing Then
http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx
вы ошиблись с сайта.
C# is
ключевое слово, и VB.Net s TypeOf ... Is ...
, проверит, является ли экземпляр типом, который реализует интерфейс.
Таким образом, ваш код будет проверять, является ли typeAsm
переменной, которая является System.Type
экземпляр, реализующий IRule
интерфейс.
С System.Type
класс не реализует IRule
, Он всегда будет возвращаться False
.
вы на самом деле пытаетесь проверить, является ли тип в лице System.Type
экземпляр осуществляет IRule
.
Для этого вам нужно использовать методы в System.Type
класса.
например:
If typeAsm.GetInterface(GetType(Rule.IRule)) IsNot Nothing Then