2010-12-01 20 views
6

ich verärgert bin, weil ich eine generische Methode aus einer anderen generischen Methode nennen möchte ..Rufen Sie eine generische Methode mit einer generischen Methode

Hier ist mein Code:

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

So in der Tat, wenn ich ToList nennen, die Datatable-Klasse ist eine Erweiterung (gelernt Here)

Der Compiler sagt, dass Y keine nicht-abstrakten Typ ist und er kann es nicht für .ToList verwenden <> generische Methode ..

Was mache ich falsch?

Danke fürs Lesen ..

+0

Vielleicht mit kompilierbarem Code beginnen? Ich nehme an, es sollte "dt.AsEnumerable(). ToList ()' –

+1

@Henk Holterman: Das OP scheint eine benutzerdefinierte Erweiterung-Methode, nicht die LINQ to Objects 'Enumerable.ToList" -Methode zu verwenden. – Ani

+0

@Ani: Ich denke schon, aber das wäre etwas zu erwähnen. –

Antwort

11

Ändern Sie die Methodensignatur:

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

Der Grund, warum Sie, dass müssen, ist, weil die benutzerdefinierte Erweiterung-Methode Sie die new() Einschränkung für seine generische Typargument verwenden auferlegt. Es muss sicherlich, da es Instanzen dieses Typs erstellt, um die zurückgegebene Liste aufzufüllen.

Offensichtlich müssen Sie auch dieser Methode mit einem generischen Typargument aufrufen, das einen nicht abstrakten Typ darstellt, der über einen öffentlichen parameterlosen Konstruktor verfügt.

+0

Was für ein dummer Fehler .. – bAN

5

Es klingt wie Sie brauchen:

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

Was ist der Unterschied zwischen WHERE Y: new() und wo Y: Klasse, neu()? Danke für die Antwort! – bAN

+2

@bAN - 'where Y: class' stellt sicher, dass' Y' ein * Referenztyp * ist (höchstwahrscheinlich eine 'Klasse'). Eigentlich brauchen Sie das vielleicht nicht - Sie müssen die verknüpfte 'ToList' erneut lesen, sie benötigt nur' where Y: new() ', also @ Anis Antwort ist korrekt. –

1

Ich denke, Sie müssen auf generische Art zu Einschränkungen, die durch where-Klausel verwenden.

Verwandte Themen