Самое простое, что нужно сделать 1002 *, это просто указать только тип элемента и жесткий код ICollection<T>
везде, где вам это нужно, например,
class MyClass<T> {
private ICollection<T> _items;
public MyClass(ICollection<T> items) {
_items = items;
}
public void Store(T obj) {
_items.Add(obj);
}
public ICollection<T> Items {
get {
return _items;
}
}
}
Я рекомендую передать экземпляр коллекции конструктору, а не создавать его внутри. Это делает класс проще и более «универсальным» (извините за каламбур) и позволяет создавать экземпляры коллекций с помощью конструкторов, отличных от заданных по умолчанию, например, словарь с компаратором не по умолчанию.
RE-EDIT (3-я попытка): Использование наследования классов и псевдонимов пространства имен для имитации typedef
оба в порядке, но обе абстракции ломаются при определенных обстоятельствах. Этот код является самым простым, который я обнаружил, который на самом деле компилируется.
Шаг 1 - Определите эти классы:
// This KeyValuePair was being used to simulate a tuple. We don't need to simulate a tuple when we have a concrete class.
class BazAndListOfWrgl {
Baz Baz { get; set; }
List<Wrgl> Wrgls { get; set; }
}
// Simple typedef.
class BazAndListOfWrglDictionary : Dictionary<Bar, BazAndListOfWrgl> { }
Шаг 2 - Определите эти псевдонимы пространства имен. Все идентификаторы должны быть полностью квалифицированы. Все упомянутые типы уже должны быть определены в другом физическом файле (поскольку псевдонимы пространства имен должны предшествовать всему коду в файле).
using OuterDictionary = System.Collections.Generic.Dictionary<MyNamespace.Foo, MyNamespace.BazAndListOfWrglDictionary>;
using OuterDictionaryItem = System.Collections.Generic.KeyValuePair<MyNamespace.Foo, MyNamespace.BazAndListOfWrglDictionary>;
Шаг 3 - Используйте их так:
class Program {
static void Main() {
// List-based example.
var listWrapper = new MyClass<BazAndListOfWrgl>(new List<BazAndListOfWrgl>());
listWrapper.Store(new BazAndListOfWrgl());
Console.WriteLine(listWrapper.Items.Count);
// Dictionary-based example.
var dictionaryWrapper = new MyClass<OuterDictionaryItem>(new OuterDictionary());
dictionaryWrapper.Store(new OuterDictionaryItem(new Foo(), new BazAndListOfWrglDictionary()));
Console.WriteLine(dictionaryWrapper.Items.Count);
}
}
Причина: BazAndListOfWrglDictionary
не может быть псевдонимом пространства имен, поскольку псевдонимы пространства имен не могут зависеть друг от друга. OuterDictionary
и OuterDictionaryItem
не могут быть производными классами, поскольку в противном случае компилятор не распознает один из них как элемент другого.