Как настроить статический список метаданных для каждого типа / класса? - PullRequest
1 голос
/ 16 июня 2009

Это продолжение до этого вопроса ...

Во-первых, у меня есть это:

public class ListForType<T>
{

    private Dictionary<Type, List<T>> listForType
        = new Dictionary<Type, List<T>>();

    public void AddList(Type type, params T[] list)
    {
        AddListForType(type, list);
        AddListFromSuperiorTypes();
    }

    public T[] GetList(Type type)
    {
        return listForType[type].ToArray();
    }

    private void AddListForType(Type type, T[] list)
    {
        if (!listForType.ContainsKey(type))
            listForType.Add(type, new List<T>());
        foreach (T item in list)
            AddItemForType(type, item);
    }

    private void AddItemForType(Type type, T item)
    {
        if (!listForType[type].Contains(item))
            listForType[type].Add(item);
    }

    private void AddListFromSuperiorTypes()
    {
        foreach (Type type in listForType.Keys)
            foreach (Type typePossibleSuper in listForType.Keys)
                if (type.IsSubclassOf(typePossibleSuper))
                    AddListForType(type, GetList(typePossibleSuper));
    }

}

Тогда у меня есть пример реализации:

public class Fruit
{

    private static ListForType<String> fruitReferenceBooks
        = new ListForType<String>();

    protected static ListForType<String> FruitReferenceBooks
    {
        get { return fruitReferenceBooks; }
        set { fruitReferenceBooks = value; }
    }

    static Fruit()
    {
        FruitReferenceBooks.AddList(typeof(Fruit),
            "A Book on Fruit");
    }

    public String[] ReferenceBooks
    {
        get { return FruitReferenceBooks.GetList(this.GetType()); }
    }

}

public class Banana : Fruit
{

    static Banana()
    {
        FruitReferenceBooks.AddList(typeof(Banana),
            "A Book on Bananas");
    }

}


public class Apple : Fruit
{

    static Apple()
    {
        FruitReferenceBooks.AddList(typeof(Apple),
            "A Book on Apples",
            "Another Book on Apples");
    }

}

public class McIntosh : Apple
{

    static McIntosh()
    {
        FruitReferenceBooks.AddList(typeof(McIntosh),
            "A Book on McIntosh Apples");
    }

}

public class GoldenDelicious : Apple
{

    static GoldenDelicious()
    {
        FruitReferenceBooks.AddList(typeof(GoldenDelicious),
            "A Book on GoldenDelicious Apples",
            "Another Book on GoldenDelicous Apples");
    }

}

Вместе с тестовым кодом:

GoldenDelicious gd = new GoldenDelicious();
    foreach (String book in gd.ReferenceBooks)
        Console.WriteLine(book);

Сдача этого:

  • Книга о золотых вкусных яблоках
  • Еще одна книга о яблочно-яблочных деликатесах
  • Книга о фруктах
  • Книга о яблоках
  • Другая книга о яблоках

Мне нужен список классов / типов, который заполняется только один раз (через статические конструкторы) и доступен через свойство экземпляра. Список «наследует» все свойства от всех супертипов (все типы в иерархии содержат весь список для иерархии, чтобы сделать доступ к списку максимально быстрым).

В примере реализации я использовал Fruit / Books-on-Fruit, чтобы объяснить, что мне нужно. (То есть «книга о фруктах» относится ко всем фруктам, «книга о яблоках» относится только к яблокам, а «книга о [конкретном типе яблока]» применима только к этому типу яблока.)

Так что в основном мой вопрос - это хорошая идея или нет? Есть ли лучший способ?

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