2

私は現在、のインターフェースを持っています

public interface IHandle<T> where T : ICommand
{
  void Invoke(T command);
}

構造マップでは、次のタイプの呼び出しで IHandle の特定の実装を取得できるため、すべてのハンドラーが StructureMap に存在することがわかります。

var commandHandler = ObjectFactory.GetInstance<IHandle<SomeCommand>>();

ただし、IHandle.

次のことを試しましたが成功しませんでした

// compile error because it doesn't have a type
ObjectFactory.GetAllInstances<IHandle<>>();

// returns 0 items
ObjectFactory.GetAllInstances<IHandle<ICommand>>();

// has runtime error of "Cannot create arrays of open type."
ObjectFactory.GetAllInstances(typeof(IHandle<>));

ジェネリック インターフェイスのすべてのインスタンスを取得する方法を知っている人はいますか?

助けてくれてありがとう

4

1 に答える 1

2

それらを排出することが目的の場合は、次のコードを使用できます。

ObjectFactory.Model.EjectAndRemovePluginTypes(x => 
    x.IsGenericType &&
    x.GetGenericTypeDefinition() == typeof(IHandle<>)
    );

すべてのインスタンスを取得することは可能ですが、System.Objectまたはとしてのみ保存できますdynamic。あなたが試したものにそれらをキャストすることはできませんIHandle<ICommand>。型の安全性を維持できなくなるため、これは許可されません。

ObjectFactory.GetAllInstances<IHandle<ICommand>>();ところで、これはゼロ項目を返す理由ではありません。これは、プラグイン タイプのインスタンスがIHandle<ICommand>登録されていないためです。おそらく実装するタイプはありませんがIHandle<ICommand>、それらを完全に作成して登録し、ObjectFactory.GetAllInstances<IHandle<ICommand>>().

したがって、System.Objectまたはdynamicインスタンスが問題ない場合は、次のことができます。

IEnumerable<IPluginTypeConfiguration> handlers =
    ObjectFactory.Model.PluginTypes
                       .Where(x => x.PluginType.IsGenericType &&
                                   x.PluginType.GetGenericTypeDefinition() == 
                                                       typeof (IHandle<>));

var allInstances = new List<object>();

foreach (IPluginTypeConfiguration pluginTypeConfiguration in handlers)
{
    var instancesForPluginType = 
              ObjectFactory.GetAllInstances(pluginTypeConfiguration.PluginType)
                           .OfType<object>();

    allInstances.AddRange(instancesForPluginType);
}

動的アプローチの場合は に変更objectします。dynamic

于 2013-11-08T20:38:23.843 に答える