我创建了一个简单的消息总线,用于排队和发出/发布事件。
我正在使用 StructureMap 来定位注册的处理程序(Action<T>
)的事件,但不确定如何将它从 StructureMap 返回的对象转换为可调用的操作。
因为我无法投射到Action<object>
我假设Action<T>
不是协变的吗?可以用另一种方式完成吗?
public class Bus
{
private ConcurrentQueue<object> events = new ConcurrentQueue<object>();
public void Queue<TEvent>(TEvent e)
{
events.Enqueue(e);
}
public void Emit()
{
object e;
while (events.TryDequeue(out e))
{
var handlerType = typeof(Action<>).MakeGenericType(e.GetType());
foreach (var handler in ObjectFactory.GetAllInstances(handlerType))
{
// how to invoke action?
}
}
}
}
由于我无法转换为 Action,我假设 Action 不是协变的?
Action<T>
is 逆变- 这是有道理的,因为Action<object>
可以被视为Action<string>
(两者都可以接受string
参考)但是Action<string>
不能被视为Action<object>
(如果您向它提供非字符串引用,您希望它做什么?)。
调用它的最简单方法可能就是使用Delegate.DynamicInvoke http://msdn.microsoft.com/en-us/library/system.delegate.dynamicinvoke%28v=vs.110%29.aspx老实说 - 另一种选择是编写一个通用方法并通过反射或使用来调用它dynamic
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)