C # Получить тип IEnumerable <TModel> - PullRequest
1 голос
/ 21 мая 2010

У меня есть метод, которому я передаю IEnumerable<TModel>. Затем, в зависимости от типа TModel, метод выполняет набор инструкций, как показано ниже:

    public void MyMethod<TModel>(IEnumerable<TModel> items) where TModel : class
    {
        int operationType;
        switch (typeof(TModel))
        {
            case typeof(MyModelOne):
                operationType = 1;
                break;
            case typeof(MyModelTwo):
                operationType = 2;
                break;
            case typeof(MyModelThree):
                operationType = 3;
                break;
            default:
                throw new Exception("The collection model passed to MyMethod is not recognized");
        }
        ...
    }

Это не работает, я получаю сообщение об ошибке:

Нет прикладной переменной или члена 'TModel'

Ответы [ 4 ]

6 голосов
/ 21 мая 2010

Вы не можете включить переменную Type. Замените его каскадными if операторами.

 if (typeof(TModel) == typeof(MyModelOne)) {
    operationType = 1;
 } else if (typeof(TModel) == typeof(MyModelTwo)) {
    operationType = 2;
 } // ...
1 голос
/ 21 мая 2010

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

Или, возможно, типы, которые вы хотите принять, могут реализоватьтот же интерфейс, и вы можете делать вызовы на них на основе интерфейса, а не проверять тип вручную.Например:

interface IDoesSomething
{
  void DoSomething();
}

void MyMethod<T>(IEnumerable<T> objects)
  where T : IDoesSomething
{
  foreach (T t in objects)
  {
    t.DoSomething();
  }
}
1 голос
/ 21 мая 2010

switch операторы работают только с постоянными значениями, такими как строки, целые числа и другие фундаментальные типы. Type не является постоянным значением, поэтому его нельзя использовать в блоке переключателей.

Эквивалентная операция - это блок if операторов или использование словаря с Type, используемым в качестве ключа.

0 голосов
/ 21 мая 2010

Вы можете только switch на целочисленных и строковых типах. В этом случае вам придется использовать if/else.

...