как вернуть IList с членами произвольного типа - PullRequest
3 голосов
/ 26 января 2010

Я не уверен, что это даже возможно, но здесь идет речь: у меня есть класс Zoo, который содержит словарь Тип животных -> Список животных. например,

Cat Type -> {Cat1, Cat2}
Zebra Type -> {Zebra1, Zebra2}

Cat и Zebra являются подклассами Animal. Теперь Zoo имеет метод IList<Animal> GetAnimalsOfType(Type type).

Я бы хотел, чтобы возвращаемое значение соответствовало типу запрашиваемого животного, поэтому вместо получения IList<Animal> я бы получил IList<Cat> или IList<Zebra> в зависимости от типа животного, которое я передал в параметр типа.

Возможно ли это? Если так, то как?

Ответы [ 2 ]

11 голосов
/ 26 января 2010

Да, что-то подобное, безусловно, возможно при использовании дженериков. Я думаю, что вы ищете это:

IList<T> GetAnimalsOfType<T>() where T : Animal {
    return dictionary[typeof(T)].OfType<T>().ToList();
}

Есть разница между этим и тем, что вы упомянули в вопросе. Тип не передан в качестве аргумента. Поскольку аргумент передается во время выполнения, не имеет смысла возвращать строго типизированный список. Компилятор все равно не узнает, и вы не сможете его использовать.

2 голосов
/ 26 января 2010

Вы можете использовать универсальный метод. Это выглядит примерно так:

public IList<T> GetAnimals<T>(){
    return this.animals[typeof(T)].Cast<T>().ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...