2016-07-14 8 views
0

ジェネリックベースクラスのサブクラスであるすべてのクラスのインスタンスを作成します。私は今、いくつかの時間を探しました。何も見つかりませんでした。C# - リフレクトを介してジェネリックベースクラスのすべてのサブクラスのインスタンスを作成

public class BaseClass<T> { } 
public class CustomSubClass: BaseClass<int> { } 

ジェネリックタイプに問題があります。私を助けることができる人?

+1

これまでに何を試しましたか?すべてのタイプを繰り返し処理し、インスタンスを作成しようとしましたか?object instance = Activator.CreateInstance(type); ? – kassi

+1

[実行時に抽象クラスを継承し、インターフェイスを実装する型の作成]の可能な複製(http://stackoverflow.com/questions/9053440/create-type-at-runtime-that-inherits-an-abstract-class- and-implements-an-interfa) –

+0

すべてのサブクラスは同じアセンブリ内にありますか? –

答えて

2

は、あなたが持っていると仮定します。そして、

class BaseClass<T> { } 

class CustomSubClass : BaseClass<int> { } 

class CustomSubClass2 : BaseClass<string> { } 

:あなたはいくつかの種類のプラグインシステムを実装しているよう

List<Type> allSubTypes = new List<Type>(); 
foreach(var assem in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
    var subTypes = assem.GetTypes().Where(x => x.BaseType != null 
         && x.BaseType.IsGenericType 
         && x.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>)); 

    allSubTypes.AddRange(subTypes); 
} 

// CustomSubClass and CustomSubClass2 
foreach (var type in allSubTypes) 
{ 
    object instance = Activator.CreateInstance(type); 
} 
+0

追加情報:Type.ContainsGenericParametersがtrueであるため、MYCLASSのインスタンスを作成できません。 – redlaz

+0

コンストラクタがある場合は、コンストラクタを表示できますか?質問を編集して追加します。それは私の側から働いています。 – user3185569

+0

ああ、少し違う特定のクラスでは失敗しました。それは魅力のように機能します! :-) ありがとうございました! – redlaz

0

が鳴ります。この種のことを行うのはMEFです。

"Managed Extensibility FrameworkまたはMEFは、軽量で拡張可能なアプリケーションを作成するためのライブラリです。アプリケーション開発者は、構成を必要とせずに拡張機能を検出して使用することができます。拡張機能がアプリケーション内で再利用されるだけでなく、アプリケーション間でも再利用できるようになります。

関連する問題