1

在我的程序中,我使用多个来源来获取数据。实际的实现并不重要,但它们都实现了一个“Source”接口,该接口调用在给定特定输入的情况下获取数据。

当我需要数据时,我想一次调用所有源并对数据进行处理。

目前我这样做:

List<Source> sources = new List<Source>()
sources.Add(new SourceA());
sources.Add(new SourceB());
//...

//----

foreach (Source source in sources)
{
string data = source.getData(input);
//do something with the data
}

问题是我需要硬编码将源插入到列表中。有没有办法(也许使用反射)自动化这个过程?我希望该列表包含所有实现“源”接口的对象 - 而不必自己对其进行硬编码。

4

3 回答 3

2

您可以使用反射在程序集中搜索实现您的接口并创建实例的类。除非基类中有共享代码,否则我会考虑重命名为 ISource。

foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
{
    if (typeof(ISource).IsAssignableFrom(type))
    {
        sources.Add((ISource)Activator.CreateInstance(type));
    }
}
于 2012-05-28T09:33:21.970 回答
1

这是我用来加载存储在外部程序集中的插件的一些代码。底部的位显示了如何使用名为“IWAPAddon”的特定接口获取所有类型,这是您可以使用的代码部分:

//If the plugin assembly is not aleady loaded, load it manually
if ( PluginAssembly == null )
{
    PluginAssembly = Assembly.LoadFile( oFileInfo.FullName );
}

if ( PluginAssembly != null )
{
    //Step through each module
    foreach ( Module oModule in PluginAssembly.GetModules() )
    {
        //step through the types in each module
        foreach ( Type oModuleType in oModule.GetTypes() )
        {
            foreach ( Type oInterfaceType in oModuleType.GetInterfaces() )
            {
                if ( oInterfaceType.Name == "IWAPAddon" )
                {
                    this.Addons.Add( oModuleType );
                }
            }
        }
    }
}
于 2012-05-28T09:37:36.597 回答
0

根据 Slugart 的建议:

foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
            {
                if (type.GetInterfaces().Contains(typeof(ISource)) && type.IsInterface == false
                {
                    sources.Add((ISource)Activator.CreateInstance(type));
                }
            }
于 2012-05-28T12:32:28.583 回答