2015-06-07 3 views
0

Пытаюсь настроить свой опыт petapoco, я следующая ситуация:C# Список Тип исполнения (petapoco)

class Animal 
{ 
// common properties 
} 

class Dog:Animal 
{ 
//particular properties including custom attributes for properly working with DB 
} 

class Cat:Animal 
{ 
} 

Обычно я использую

List<Dog> ret = db.Query<Dog>("select * from dogs").ToList(); 

Я создал список (категория) хранящих треки между таблицами в базе данных и объектами, фактически реализованными в моем коде (например, собака класса)

Таким образом, я получаю тип во время выполнения из списка категорий:

Type t = ((Category)Categories.Current).ObjectType; 

В моем отладчике я вижу тип Dog для t. Но я не знаю, как преобразовать полученный во время выполнения тип в то полезное для

List<t> ret = db.Query<t>("select * from ...").ToList(); 

Заранее спасибо,

PS. Я не хочу использовать базовый Animal для списка запросов, поскольку список результатов заполняет GridView, а производные классы (например, Dog) содержат определенные атрибуты для отображения, фильтрации и т. Д.

+0

Возможно, вы могли бы использовать отражение для вызова 'Query'? ([This] (http://stackoverflow.com/a/232621) может помочь, в этом случае это дубликат [Как использовать отражение для вызова общего метода?] (Http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method).) –

ответ

1

Я думаю, что лучше всего вы можете сделать это иметь что-то вроде этого:

public static IList FetchAllByCategory(Type category) 
{ 
    string sql = "select * from " + category.Name + "s"; 
    if (category == typeof(Dog)) return db.Fetch<Dog>(sql); 
    if (category == typeof(Cat)) return db.Fetch<Cat>(sql); 
    ... 
} 

Обратите внимание, что вы не можете использовать List<Animal> в качестве возвращаемого типа, как список производного типа не уступка совместима со списком базового типа. IList - самый большой общий знаменатель здесь. Но есть шанс, что GridView фактически видит реальныйList<T>, назначенный его источнику данных. (Обычно привязка данных источников набраны в качестве object в любом случае.

Fetch<T>(), как Query<T> но возвращает List<T> вместо IEnumerable<T>.

+0

Спасибо, я попробую! – user1797147

0

@ Габор Bakos спасибо.

Ну, я нашел способ, но необходимо добавить фиктивные виртуальные GetObjects() в классе животных, а затем переопределить GetObjects() для каждой собаки, кошки и так далее.

Type type = ((Category)Categories.Current).ObjectType; // get type 
object rtObject = Activator.CreateInstance(type); // create instance 
((Animal)rtObject).GetObjects(); // call some known base method 

Но подняться на questi on: мне нужен этот сложный путь?

Я думаю, что могу просто создать GetObjects() с жестко закодированным переключателем по типу, а затем вызвать реальные методы.

Смежные вопросы