Подтвердить что ты не робот

Сохранение Action <T> в одной коллекции для последующего использования

Я пытаюсь сохранить в памяти набор ссылок типа 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));
    }
}

Кто-нибудь знает лучший подход к решению этой проблемы? Спасибо заранее.

4b9b3361

Ответ 1

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

Затем, скажем, вы хотите вызвать его, вы можете просто выполнить бросок:

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