将Action <T>存储在单个集合中以供以后使用

bor*_*mez 10 c# generics

我试图在内存中保存一个类型的引用集合,Action<T>其中T是变量类型

我找到了解决方案,dynamic但我不想使用动态解决方案

public class MessageSubscriptor:IMessageSubscriptorPool
{
    Dictionary<Type, Action<dynamic>> Callbacks = new Dictionary<Type, Action<dynamic>>();
    public void Subscribe<T>(Action<T> callback) where T :IMessage
    {
        Callbacks.Add(typeof(T), (obj) => callback(obj));
    }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道更好的处理方法?提前致谢.

Luc*_*ski 10

Action<T>是一个Delegate,所以...

public class MessageSubscriptor:IMessageSubscriptorPool
{
    private readonly Dictionary<Type, Delegate> _callbacks = new Dictionary<Type, Delegate>();

    public void Subscribe<T>(Action<T> callback) where T :IMessage
    {
        _callbacks.Add(typeof(T), callback);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,假设你要调用一个,你可以简单地执行一个演员:

public void Invoke<T>(T message) where T :IMessage
{
    Delegate callback;
    if (_callbacks.TryGetValue(typeof(T), out callback))
        ((Action<T>)callback).Invoke(message);
}
Run Code Online (Sandbox Code Playgroud)