2010-12-01 5 views
6

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

Вот мой код:

public List<Y> GetList<Y>(
       string aTableName, 
       bool aWithNoChoice) 
{ 
    this.TableName = aTableName; 
    this.WithNoChoice = aWithNoChoice; 

    DataTable dt = ReturnResults.ReturnDataTable("spp_GetSpecificParametersList", this); 

    //extension de la classe datatable 
    List<Y> resultList = (List<Y>)dt.ToList<Y>(); 

    return resultList; 
} 

Так ведь когда Я называю ToList, который является расширением класса DataTable (узнало Here)

компилятор говорит, что Y не является неабстрактным типом, и он не может использовать его для .ToList <> общего метода ..

Что я делаю неправильно?

Спасибо за чтение ..

+0

Может начаться со скомпилированного кода? Я предполагаю, что это должно быть 'dt.AsEnumerable(). ToList ()' –

+1

@Henk Holterman: OP, похоже, использует собственный метод расширения, а не метод LINQ to Objects 'Enumerable.ToList'. – Ani

+0

@Ani: Я так думаю, но это было бы что-то сказать. –

ответ

11

Изменить метод подпись:

public List<Y> GetList<Y>(
       string aTableName, 
       bool aWithNoChoice) where Y: new() 

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

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

+0

Какая глупая ошибка .. – bAN

4

Похоже, что функция ToList имеет ограничение на тип:

where T : new() 

Я думаю, что если вы используете тот же ограничение на вашей функции (но с Y вместо T) он должен работать.

Вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-us/library/sd2w2ew5(v=VS.80).aspx

5

Это звучит, как вам нужно:

public List<Y> GetList<Y>(
    string aTableName, 
    bool aWithNoChoice) where Y : class, new() 
{ ... } 
+2

какая разница между WHERE Y: new() и где Y: class, new()? Спасибо за ответ! – bAN

+2

@bAN - 'где Y: class' гарантирует, что' Y' является * ссылочным типом * (скорее всего, 'class'). На самом деле вам может не понадобиться это - перечитывая связанный 'ToList', он просто нуждается в том, где Y: new()', поэтому ответ Ани правильный. –

1

Я думаю, вам нужно ограничения на вашем общем типе с помощью ИНЕК.

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