2010-12-01 8 views
6

Je suis agacé parce que je voudrais appeler une méthode générique d'une autre méthode générique ..Appelez une méthode générique avec une méthode générique

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

Donc, en fait, quand J'appelle ToList qui est une extension de la classe DataTable (appris Here)

Le compilateur dit que Y ne soit pas un type non abstrait et il ne peut pas l'utiliser pour .ToList <> méthode générique ..

Qu'est-ce que je fais de mal?

Merci pour la lecture ..

+0

Peut-être commencer par le code compilable? Je suppose qu'il devrait être 'dt.AsEnumerable(). ToList ()' –

+1

@Henk Holterman: L'OP semble utiliser une méthode d'extension personnalisée, pas la méthode LINQ to Objects 'Enumerable.ToList'. – Ani

+0

@Ani: Je suppose que oui, mais ce serait quelque chose à mentionner. –

Répondre

11

Modifier la signature de la méthode à:

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

La raison pour laquelle vous avez besoin c'est parce que l'extension méthode personnalisée que vous utilisez impose la contrainte new() sur son argument de type générique. Il doit certainement, car il crée instances de ce type pour remplir la liste retournée.

De toute évidence, vous devrez également appeler cette méthode avec un argument de type générique qui représente un type non-abstrait qui a un constructeur public sans paramètre.

+0

Quelle erreur stupide .. – bAN

5

On dirait que vous avez besoin:

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

quelle est la différence entre WHERE Y: new() et où Y: classe, nouveau()? Merci pour la réponse! – bAN

+2

@bAN - 'où Y: class' s'assure que' Y' est un * type de référence * (très probablement, une 'class'). En fait, vous n'aurez peut-être pas besoin de cela - en relisant le 'ToList' lié, il faut juste' où Y: new() ', donc la réponse de @ Ani est correcte. –

1

Je suppose que vous avez besoin de contraintes sur votre type générique en utilisant la clause where.

Questions connexes