2016-09-23 3 views
0

В приведенном ниже примере у меня есть метод GetList, который принимает один строковый параметр и возвращает объекты List. Я фиксирую это в общей переменной IEnumerable, потому что во время выполнения я понятия не имею, какой объект пользователь может захотеть. Как я могу использовать фактический тип вместо объекта?IEnumerable переменной типа

Я хочу, чтобы заменить это ...

IEnumerable<object> data = GetList(entityName); 

С этим ...

IEnumerable<Company> data = GetList(entityName); 

Единственный способ, которым я могу думать о обращении с ним прямо сейчас, который я не собираюсь делать потому что мы имеем 300+ сущности нечто вроде

switch(entitName) 
{ 
    case "Company": 
    IEnumerable<Company> data = GetList(entityName); 
    break; 

    case "Employee": 
    IEnumerable<Employee> data = GetList(entityName); 
    break; 

    ... 
} 
+0

'GetList (entityName) .Cast ()' –

+0

Я не знаю, что это будет компания. Это может быть Employee или Role и т. Д. Единственная информация, которая у меня есть, - это строка (entityName), представляющая объект, который они хотят запросить. – jjf1978

+0

Ну, в этом случае вы должны сохранить свой объект. Компилятор не может знать и вас. Вам нужно будет сделать несколько тиков, чтобы узнать, какой тип вы используете. Или вам нужно предоставить нам контекст, в котором выполняется ваш код, чтобы мы могли найти работу. –

ответ

2

Вы не можете использовать такой тип в соответствующем коде - так что нет никакого способа создать его без отражения.

Ближе всего вы можете получить то, что вам кажется нужным, это IEnumerable<dynamic>, чтобы вы могли получить доступ к объекту объекта на основе их типа времени выполнения.

Если вам просто нужно создать строго типизированный перечислимый, чтобы вернуться к другому коду, ожидающему лучшего, чем IEnumerable<object>, вы можете использовать отражение для создания такого типа (Create generic List<T> with reflection).

Вы также можете иметь универсальную функцию, которая обращается к результату строго типизированным образом, но вместо того, чтобы называть его напрямую, вызовите его через отражение после использования MakeGenericMethod с правильным типом (How do I use reflection to call a generic method?).

+1

Спасибо! Реальный ответ вместо snark :) – jjf1978

0

Вы можете сделать GetList() родовое:

IEnumerable<Company> data = GetList<Company>(entityName); 

IEnumerable<T> GetList<T>(string entityName) 
{ 
    List<T> list = new List<T>(); 

    // Populate list here 

    return list; 
} 
+0

Я не могу указать тип e, потому что все, что мне нужно, это строка. Конечный пользователь нажимает список, который возвращает строку в мое приложение, тогда приложение должно выполнить выборку этого объекта. Итак, я не могу получить хард-код GetList jjf1978

+2

Как вы ожидаете сделать что-нибудь значимое в списке, который вы вернетесь, если вы ничего не знаете об этом? – itsme86

+0

Это как раз проблема. Обо всем, что я могу сделать с возвращенным списком, является его привязка. Я могу использовать отражение, чтобы мучительно смотреть на все свойства, но я действительно не хочу этого делать ... В принципе, я хочу переменный тип – jjf1978

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