我目前有
的界面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<>));
有谁知道如何获取通用接口的所有实例?
感谢您的帮助
答案 0 :(得分:1)
如果你的目标是弹出它们,那么你可以使用以下代码:
ObjectFactory.Model.EjectAndRemovePluginTypes(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(IHandle<>)
);
可以获取所有实例,但您只能将其存储为System.Object
或dynamic
。你无法将它们转换为你尝试过的IHandle<ICommand>
。这是不允许的,因为如果它类型安全就不能再保持。
BTW这不是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
以获取动态方法。