1

私のプログラムでは、多くのソースを使用してデータを取得しています。実際の実装はそれほど重要ではありませんが、それらはすべて、特定の入力を指定してデータを取得するための呼び出しを持つ「ソース」インターフェイスを実装しています。

データが必要なときは、すべてのソースを一度に 1 つずつ呼び出して、データを処理したいと考えています。

現在、私はこれを行います:

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 に答える