gpt4 book ai didi

c# - 如何将对象转换为 Action

转载 作者:行者123 更新时间:2023-11-30 14:31:15 34 4
gpt4 key购买 nike

我创建了一个简单的消息总线,用于排队和发出/发布事件。

我正在使用 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?
}
}
}
}

最佳答案

Since I can't cast to Action I'm assuming that Action is not covariant?

Action<T>逆变 - 这是有道理的,因为 Action<object>可以被视为 Action<string> (两者都可以接受 string 引用)但是 Action<string>不能被视为 Action<object> (如果您向它提供非字符串引用,您希望它做什么?)。

调用它的最简单方法可能就是使用 Delegate.DynamicInvoke 老实说——另一种选择是编写一个通用方法并通过反射或使用 dynamic 调用它。 .

关于c# - 如何将对象转换为 Action<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20800075/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com