Мне нужно знать, реализует ли 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)
UPDATE2: Спасибо Бену Войгту.Он убедил меня, что IsAssignableFrom в сочетании с IsAbstract может быть лучшим способом проверить, реализует ли данный тип интерфейс и не является самим интерфейсом (что вызывает исключение MissingMethodException, если вы пытаетесь создать экземпляр).1032 *
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then