在集合中存储具有不同泛型类型参数的项目

时间:2013-11-26 11:55:14

标签: c# generics generic-collections

我知道这里有几个关于我的问题的帖子,但似乎没有一个提供特定于我的案例的解决方案。

我有一个简短的静态类,看起来像这样:

public static class NotificationCenter
{
    private static readonly Dictionary<Type, object> Notifiers = new Dictionary<Type, object>();

    public static INotifier<T> NotifierForType<T>()
    {
        object notifier = null;
        return Notifiers.TryGetValue(typeof(T), out notifier) 
            ? (INotifier<T>)notifier 
            : null;
    }

    public static void RegisterNotifier<T>(INotifier<T> notifier)
    {
        Notifiers[typeof(T)] = notifier;
    }
}

以上工作正常,但我并不热衷于将INotifiers存储在IDictionary<Type, object>中 - 具体而言,我并不热衷于object部分,因为它使收集非类型安全。

我已经阅读了很多类似的帖子,建议从名为INotifier<T>的基本接口派生INotifier,但我不相信这在我的实例中是合适的,因为INotifier<T>接口看起来像这样:

interface INotifier<T>
{
    void Notify(T notification);
}

如果我是从基类派生的,那么基类将无法实现Notify方法(除非它是使用签名void Notify(object notification)实现的,但我们又回到了原点),并且这就是我希望INotifier<T>类的客户端能够调用的内容。

1 个答案:

答案 0 :(得分:1)

您需要枚举所有通知者吗?如果不是,解决方案可以非常简单:

namespace NotifierTest
{
    interface INotifier<T>
    {
        void Notify(T notification);
    }

    class Notifier<T> : INotifier<T>
    {
        public void Notify(T notification) 
        {
            Debug.Print("Notify: " + notification);
        }
    }

    static class NotificationCenter<T>
    {
        public static INotifier<T> notifier;
    }

    class Program
    {
        static void Main(string[] args)
        {
            NotificationCenter<int>.notifier = new Notifier<int>();
            NotificationCenter<int>.notifier.Notify(5);
        }
    }
}