#c# #generics #casting
#c# #общие #Кастинг
Вопрос:
Я пытаюсь получить строго типизированное подмножество коллекции на основе типа экземпляра подкласса, переданного в эту функцию. Я не уверен, что это возможно, но решил спросить.
Вот некоторый псевдокод:
void DoSomething(UIElement child){
var otherChildrenOfSameType = Children
.OfType<WhatGoesHere>() // What goes here?
.Where(c => c != child);
}
Обычно я бы просто использовал общие объекты, например…
void DoSomething<TChild>(TChild child)
where TChild : UIElement {
var otherChildrenOfSameType = Children
.OfType<TChild>()
.Where(c => c != child);
}
…но, к сожалению, я не могу изменить подпись.
Как упоминалось выше, я думаю, что это невозможно, по крайней мере, не типобезопасным способом, потому что вам нужен тип во время компиляции, который это не обеспечивает.
Я думаю, что лучшее, что я могу сделать, это это…
void DoSomething(UIElement child){
var childType = child.GetType();
var otherChildrenOfSameType = Children
.Where(c => c.GetType() == childType amp;amp; c != child);
}
…но, конечно, это всего лишь набор UIElement
объектов. Это работает, но я просто пытаюсь быть более типобезопасным, если хотите. Есть ли другой способ, которого я не вижу?
Комментарии:
1. Может ли список типов быть ограничен? Вы могли бы использовать сопоставление с образцом и делать что-то в зависимости от типа.
2. Это интересно! Да, он ограничен. Однако это около 10 разных типов, поэтому я не очень люблю гигантские операторы переключения. Я подумываю о том, чтобы сделать их списком «динамических» объектов, чтобы я мог получить доступ к необщим свойствам.
3. В третьем фрагменте кода нет ничего небезопасного для типов. Это не значит, что вам нужно возвращать коллекцию дочернего типа или что-то в этом роде.
4. Да, дело не в том, что он небезопасен для типов, он просто не строго типизирован для конкретного подкласса, только для базового класса. Но опять же, мне не нужен подкласс здесь, так что это работает. Просто более подробный. Однако моему OCD это не нравится … lol… так привык
OfType<SomeType>()
и никогда не осознавал / сталкивался со случаем, когда у меня не было типа во время компиляции до сегодняшнего вечера, поэтому я просто ною. lol