Вызывать универсальный метод, который возвращает коллекцию универсальных шаблонов, не зная, что это за тип? C # - PullRequest
1 голос
/ 08 декабря 2010

Я просто потренировался в написании проекта типа ORM на C #.

По сути, у меня есть такая структура классов:

IDBOperation --- DBReadOperation

DBOperationPool

По сути, DBReadOperation отображает данные из указанной таблицы базы данных в класс в моем решении, например, PersonDetails.

Код для этого был взят из внешнего источника (не может вспомнить?) И в основном возвращает универсальную коллекцию (Collection).

Мой DBOperationPool должен иметь возможность принимать любое количество DBReadOperation и возвращать результаты для каждого из них. Логика для этого у меня внизу ... но не могу заставить код работать?

Класс отображения также построен на обобщениях .. так, как я могу создать экземпляр класса отображения, чтобы он был похож на ..

MappingClass<?> mappingInstance = new MappingClass<?>();
Collection<?> returnedCollection = mappingInstance.MapData(argument);

Как мне (используя обобщения, рефлексию или что-то еще) выяснить, что ставить, где знаки вопроса находятся выше? Это можно сделать? У меня был поиск вокруг, и, кажется, ничто не связано с этой проблемой ..

Очевидно, что простой маршрут - заставить пул включать в себя тип, к которому я хочу отобразить ... но суть пула в том, что я могу добавить к нему DBReadOperation, скажем, для PersonDetails, CompanyDetails и т. Д., И данные отображаются там, где они должны быть, и возвращают результаты правильно для каждого типа. С помощью этого маршрута я могу выбросить любое количество DBReadOperations в пул, если они имеют дело с определенным типом для каждого экземпляра DBOperationPool .. но это не то, что я хочу ..

Имеет ли это смысл?

С уважением,

Simon

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Может ли ваш класс DBReadOperation быть универсальным?Это означает, DBReadOperation<T>, а затем вы создаете его с помощью:

var dbReadOperation = new DBReadOperation<PersonDetails>();

MappingClass будет принимать DBReadOperation и возвращать T. Он может использоваться как:

var mapper = new MappingClass<DBReadOperation<PersonDetails>>();
Collection<PersonDetails> collection = mapper.MapData(someArgument);
2 голосов
/ 08 декабря 2010

Заставьте MappingClass реализовать некоторый интерфейс, IMappingClass, а затем обращайтесь к нему везде, где вы не знаете, какой тип будет содержать шаблон.

public interface IMappingClass {
   public void DoStuff();
}

public class MappingClass<T> : IMappingClass {
   // stuff
}

// ... elsewhere ...

public void DoMappingStuff(IMappingClass map){
   map.DoStuff();
   // do other stuff...
}

// ...

MappingClass<string> myStringMap = new MappingClass<string>();
DoMappingStuff(myStringMap);

MappingClass<int> myIntMap = new MappingClass<int>();
DoMappingStuff(myIntMap);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...