2010-12-01 24 views
6

estoy molesto porque me gustaría llamar a un método genérico de un método genérico otra ..Llamar a un método genérico con un método genérico

Aquí está mi código:

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

Así que, de hecho, cuando me llamo ToList que es una extensión de la clase DataTable (aprendido Here)

El compilador dice que y no es un tipo no abstracta y no puede utilizarlo para .ToList <> método genérico ..

¿Qué estoy haciendo mal?

Gracias por leer ..

+0

¿Quizás comience con un código compilable? Supongo que debería ser 'dt.AsEnumerable(). ToList ()' –

+1

@Henk Holterman: El OP parece estar usando un método de extensión personalizado, no el método LINQ to Objects 'Enumerable.ToList'. – Ani

+0

@Ani: Supongo que sí, pero eso sería algo para mencionar. –

Respuesta

11

cambiar el método de firma a:

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

La razón es necesario que se debe a la extensión-método personalizado utiliza impone la restricción new() en su argumento de tipo genérico. Ciertamente necesita, ya que crea instancias de este tipo para completar la lista devuelta.

Obviamente, también tendrá que llamar a este método con un argumento de tipo genérico que representa un tipo no abstracto que tiene un constructor público sin parámetros.

+0

¡Qué error tan estúpido .. – bAN

5

Suena como que necesita:

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

cuál es la diferencia entre WHERE Y: new() y donde Y: clase, nuevo()? ¡Gracias por responder! – bAN

+2

@bAN - 'donde Y: clase' asegura que' Y' es un * tipo de referencia * (muy probablemente, una 'clase'). De hecho, es posible que no lo necesites: al volver a leer el 'ToList' vinculado, solo necesita' donde Y: new() ', por lo que la respuesta de @ Ani es correcta. –

1

supongo que necesita a las limitaciones en su tipo genérico mediante el uso de cláusula where.

Cuestiones relacionadas