Как создать универсальный статический словарь в статическом классе - PullRequest
3 голосов
/ 31 августа 2011
    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;
        }
    }

1 Ответ

8 голосов
/ 31 августа 2011

Вы не объявили Tracking в качестве универсального типа, поэтому T, K и V не имеют значения. Вы можете сделать это достаточно легко:

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

Обратите внимание, что теперь у вас будет отдельные Lists, Dictionaries и т. Д. Поля для конкретного типа. Вам нужно будет сделать методы не универсальными.

Альтернативой может быть неуниверсальный класс верхнего уровня с универсальными методами и универсальными вложенными типами:

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

Я бы также настоятельно не советовал против публичных полей, подобных этой ... и против широкого использования статики для начала, учитывая проблемы, которые они вызывают для тестируемости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...