使用VB.Net获取实现特定接口的所有类类型

时间:2016-02-04 08:41:35

标签: .net vb.net winforms reflection interface

我想加载实现接口IFormLoadSubscriber的所有表单。

接口

Namespace Interfaces
    Public Interface IFormLoadSubscriber

    End Interface
End Namespace

此时它没有添加任何内容,订阅就足够了。

表格

Namespace Forms
    Public Class MainForm
        Inherits Base.Base
        Implements IFormLoadSubscriber

    End Class
End Namespace

Base.Base是一个强制执行基本行为的表单。

我有什么

Private Shared Function GetSubscribers() As List(Of Type)
    Dim type = GetType(IFormLoadSubscriber)
    Dim subscribers = AppDomain.CurrentDomain.GetAssemblies() _
                      .Where(Function(x) type.IsAssignableFrom(type)) _
                      .Select(Function(x) x.GetTypes())

    Return subscribers
End Function

问题

上面的代码没有按预期工作,因为它返回一个包含各种类型的大型列表。如果包含我的,则无法手动查找。无论如何,这不是我所需要的。

问题

如何更改上面的代码,使其只返回一个类(因为只有一个类实现IFormLoadSubscriber),在本例中是我的MainForm?

2 个答案:

答案 0 :(得分:4)

尝试将其更改为

Private Shared Function GetSubscribers() As List(Of Type)
    Dim type = GetType(IFormLoadSubscriber)
    Dim subscribers = AppDomain.CurrentDomain.GetAssemblies() _
                      .SelectMany(Function(x) x.GetTypes()) _
                      .Where(Function(x) type.IsAssignableFrom(x))

    Return subscribers
End Function

Getting all types that implement an interface

答案 1 :(得分:2)

SelectMany将比列表列表更紧密。

Dim subscribers = AppDomain.CurrentDomain.GetAssemblies() _
                      .SelectMany(Function(x) x.GetTypes() _
                                  .Where(Function(y) type.IsAssignableFrom(y)))

我还在SelectMany中移动了Where子句。

你的where子句也不正确,type.IsAssignableFrom(type)总是如此。