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.Objectdynamic。你不能将它们投射到你尝试过的东西上IHandle<ICommand>。这是不允许的,因为如果它会类型安全将无法再维护。

顺便说一句,这不是ObjectFactory.GetAllInstances<IHandle<ICommand>>();返回零项的原因。这是因为根本没有IHandle<ICommand>注册插件类型的实例。您可能没有实现的类型,IHandle<ICommand>但您完全可以创建和注册它们并使用ObjectFactory.GetAllInstances<IHandle<ICommand>>().

因此,如果System.Objectdynamic实例都可以,您可以执行以下操作:

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);
}

更改objectdynamic动态方法。

于 2013-11-08T20:38:23.843 回答