Это продолжение до этого вопроса ...
Во-первых, у меня есть это:
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, чтобы объяснить, что мне нужно. (То есть «книга о фруктах» относится ко всем фруктам, «книга о яблоках» относится только к яблокам, а «книга о [конкретном типе яблока]» применима только к этому типу яблока.)
Так что в основном мой вопрос - это хорошая идея или нет? Есть ли лучший способ?