3

このように、アセンブリをロードして、特定のインターフェイスを実装するすべての型を取得するためのコードがいくつかあります (asm が有効でロードされたアセンブリであると仮定します)。

var results = from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select type;

これらのオブジェクトのインスタンスを作成し、オブジェクトのメソッドとプロパティを呼び出す必要があります。そして、後で使用できるように、作成されたオブジェクトへの参照を配列に格納する必要があります。

4

2 に答える 2

11

うわー、数日前にこれについてブログを書いたばかりです。特定のインターフェイスを実装するすべての型のインスタンスを返すメソッドは次のとおりです。

private static IEnumerable<T> InstancesOf<T>() where T : class
{
    var type = typeof(T);
    return from t in type.Assembly.GetExportedTypes()
           where t.IsClass
               && type.IsAssignableFrom(t)
               && t.GetConstructor(new Type[0]) != null
           select (T)Activator.CreateInstance(t);
}

インターフェイスのアセンブリを使用するのではなく、アセンブリ パラメータを受け入れるようにこれをリファクタリングすると、必要に応じて十分に柔軟になります。

于 2008-11-11T10:53:31.477 に答える
1

メソッドを使用して型のインスタンスを作成できますActivator.CreateInstance:-

IServiceJob x = Activator.CreateInstance(type);

だからあなたのコードは次のようになります:-

IServiceJob[] results = (from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select (IServiceJob)Activator.CreateInstance(type)).ToArray();

(var を IServiceJob[] に変更して、何が作成されているかを明確にすることに注意してください)。

于 2008-11-11T11:02:39.510 に答える