c# - 如何在静态类中创建通用静态字典

标签 c# generics static

    public static class Tracking
    {

        public static List<TrackList<T>> Lists = new List<TrackList<T>>();

        public static List<TrackedDictionary<K,V>> Dictionaries =new List<TrackedDictionary<K,V>>()

        public static void Register<K,V>(TrackedDictionary<K,V> dictionary)
        {
            Dictionaries.Add(dictionary);
        }

        public static void Register<T> (TrackList<T> list)
        {
            Lists.Add(list);
        }
    }

public class TrackList<T> : List<T>
    {
        private string ListName = null;
        private int AvgSize;

        public TrackList ()
        { }

        public TrackList (string listname, int avgsize)
        {
            this.ListName = listname;
            this.AvgSize = avgsize;
            Tracking.Register(this);
        }

        public int GetListSize ()
        {
            return this.Count * this.AvgSize;
        }
    }

public class TrackedDictionary<K, V> : Dictionary<K, V>
    {
        public string DictionaryName = null;
        public byte AvgSize;

        public TrackedDictionary ()
        { }

        public TrackedDictionary (string dictionaryname, byte avgsize)
        {
            this.DictionaryName = dictionaryname;
            this.AvgSize = avgsize;
            Tracking.Register(this);
        }

        public int GetDictionarySize ()
        {
            return this.Count * this.AvgSize;
        }
    }

最佳答案

您还没有将 Tracking 声明为通用类型,因此 TKV 没有意义。你可以很容易地做到这一点:

public static class Tracking<T, K, V>
{
    ...
}

请注意,现在每个具体类型都有单独的 ListsDictionaries 等字段。不过,您需要使这些方法成为非泛型的。

另一种方法是拥有一个顶级非泛型类,具有泛型方法和泛型嵌套类型:

public static class Tracking
{
    private static class ListHelper<T>
    {
        internal static List<TrackList<T>> Lists = new List<TrackList<T>>();
    }

    private static class DictionaryHelper<K, V>
    {
        internal static List<TrackedDictionary<K,V>> Dictionaries =
            new List<TrackedDictionary<K,V>>()
    }

    public static void Register<K,V>(TrackedDictionary<K,V> dictionary)
    {
        DictionaryHelper<K, V>.Dictionaries.Add(dictionary);
    }

    public static void Register<T> (TrackList<T> list)
    {
        ListHelper<T>.Lists.Add(list);
    }
}

我还强烈建议不要使用这样的公共(public)字段...并且不要一开始就广泛使用静态,因为它们会导致可测试性问题。

关于c# - 如何在静态类中创建通用静态字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7255308/

相关文章:

asp.net-mvc - 公共(public)静态类数据对于 ASp.net MVC 中的所有用户都相同吗?

c# - 如何开始使用 Microsoft 的 RibbonControlsLibrary?

java - 用于获取和调用具有通用父级的子级的方法的编程返回类型或转换

ios - 在协议(protocol)扩展中将 nil 传递给具有可选的一般约束参数的函数

java - 使用泛型避免编译错误

python - 如何使用静态方法初始化静态变量?

java - 无法从静态上下文引用非静态变量 jTextField1

c# - 如何将字符串拆分为数组?

c# - 您如何将 WCF WSDL 和 XSD 共享给尚未访问该服务的客户端?

c# - 未调用构造函数