2016-02-04 39 views
1

我想加载实现接口IFormLoadSubscriber的所有窗体。获取使用VB.Net实现特定接口的所有类类型

接口

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

看看这个部分:'type.IsAssignableFrom(type)' – sloth

+0

看起来好像,看起来不正确......我该如何解决这个问题?我想我需要像'.Where(Function(x)x.GetType()。IsAssignableFrom(type))'''但是不会返回任何东西。 – Spikee

回答

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

+0

这是有效的!但是,如果我不添加'.Where(Function(x)x IsNot type)',它还会返回'IFormLoadSubscriber',这不是我想要的(这会导致错误),而且这是非常意外的,因为'IFormLoadSubscriber'显然没有实现... – Spikee

2

SelectMany将压扁比名单列表。

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

我也移动了SelectMany中的Where子句。

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

相关问题