2010-12-01 15 views
6

jestem zirytowany, ponieważ chciałbym wywołać metodę rodzajową z innej metody rodzajowe ..Wywołuje metodę ogólną z ogólnej metody

Oto mój kod:

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; 
} 

Więc gdy w rzeczywistości wzywam ToList która jest rozszerzeniem klasy DataTable (nauczył Here)

kompilator mówi, że Y nie jest non-streszczenie Rodzaj i nie można go używać do .ToList <> metoda rodzajowa ..

Co robię źle?

Dzięki za czytanie ..

+0

Może zacząć od kompilacji kodu? Zakładam, że powinno to być 'dt.AsEnumerable(). ToList ()' –

+1

@Henk Holterman: OP wygląda na to, że używa niestandardowej metody rozszerzenia, a nie metody LINQ to Objects Enumerable.ToList'. – Ani

+0

@Ani: Chyba tak, ale byłoby to o czymś wspomnieć. –

Odpowiedz

11

Zmiany metoda podpis do:

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

Powodem trzeba, że ​​to dlatego, że zwyczaj przedłużenie-metoda korzystania nakłada new() ograniczenie na jego ogólny typ argumentu. Z pewnością musi, ponieważ tworzy instancji tego typu, aby zapełnić zwróconą listę.

Oczywiście trzeba będzie również zadzwonić pod numer z ogólnym typem argumentu, który reprezentuje typ nie abstrakcyjny, który ma publiczny konstruktor bez parametrów.

+0

Co za głupi błąd .. – bAN

5

Brzmi jak trzeba:

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

jaka jest różnica między WHERE Y: new() i gdzie Y: klasa, nowa()? Dzięki za odpowiedź! – bAN

+2

@bAN - 'where Y: class' zapewnia, że' Y' jest * typem referencyjnym * (najprawdopodobniej 'klasa'). Właściwie możesz tego nie potrzebować - ponowne czytanie połączonej "ToList", która właśnie potrzebuje ', gdzie Y: new()', więc odpowiedź @ Ani jest poprawna. –

1

Chyba trzeba ograniczeń typu generycznego za pomocą klauzuli WHERE.

Powiązane problemy