Что у меня есть?C# Проблема с дженериками
У меня есть абстрактный класс, QueryExecutor
и производный класс, SqlQueryExecutor
, показанный ниже.
abstract class QueryExecutor<T>
{
public abstract T Execute();
}
class SqlQueryExecutor<T> : QueryExecutor<T> where T:ICollection
{
public override T Execute()
{
Type type = typeof(T);
// Do common stuff
if (type == typeof(ProfileNodeCollection))
{
ProfileNodeCollection nodes = new ProfileNodeCollection();
// Logic to build nodes
return (T)nodes;
}
else
{
TreeNodeCollection nodes = new TreeNodeCollection();
Logic to build nodes
return (T)nodes;
}
}
}
Что я хочу делать?
В реализации метода Execute()
, я хочу построить соответствующий объект ICollection
и вернуть его.
С какой проблемой сталкиваюсь я?
В Execute()
методы, линия, return (T)nodes;
показывает следующую ошибку компиляции времени:
Cannot convert type 'WebAppTest.ProfileNodeCollection' to 'T'
Любая идея, как я могу решить эту проблему?
Заранее благодарен!
Вы уже задавали этот вопрос час назад: Дизайн Проблема - общий базовый класс и различные типы возврата: http://stackoverflow.com/questions/1605659/design-problem-common-base-class-and- different-return-types –
Я не уверен, почему возникает проблема, но это такое злоупотребление дженериками, от которых я вообще не хочу отвечать ... Весь смысл дженериков в том, что они должны быть * generic * и не должны содержать особого поведения для разных конкретных типов 'T' (подробнее см. Принцип замещения Лискова). Если вы делаете такие вещи, вам будет лучше с «ProfileNodeCollectionQueryExecutor» и «TreeNodeCollectionQueryExecutor» в качестве отдельных классов (т. Е. Если ваша ситуация требует полиморфизма, а затем используйте его). –
@ Mitch Wheat: Я попытался выполнить ответ на предыдущий вопрос и получил здесь удар. Мысль об обновлении того же вопроса, но я отметил это как ответ. Итак, возник еще один вопрос. Хотя, этот вопрос касается реализации части предыдущего вопроса. – Vijay