2009-01-08 20 views
18

¡Estoy seguro de haber hecho esto antes, pero no puedo encontrar ningún ejemplo! Grrr ...Método genérico en una clase no genérica?

Por ejemplo, quiero convertir un IList<T> en un BindingList<T>:

public class ListHelper 
{ 
    public static BindingList<T> ToBindingList(IList<T> data) 
    { 
     BindingList<T> output = new BindingList<T>(); 

     foreach (T item in data) 
      output.Add(item); 

     return output; 
    } 
} 
+0

¿Cuál es la pregunta real aquí? Sí, los métodos genéricos están bien en las clases no genéricas (System.Linq.Enumerable es probablemente el mayor ejemplo). –

+2

@Jon - se perdió el en ToBindingList –

Respuesta

31
ToBindingList <T> (...) 

public class ListHelper 
{ 
    public static BindingList<T> ToBindingList<T>(IList<T> data) 
    { 
     BindingList<T> output = new BindingList<T>(); 

     foreach (T item in data) 
     { 
      output.Add(item); 
     } 

     return output; 
    } 
} 
7

Usted puede hacer esto mediante el método de extensión y sería mejor.

public static class Extensions 
{ 
    public static BindingList<T> ToBindingList<T>(this IList<T> list) 
    { 
     BindingList<T> bindingList = new BindingList<T>(); 

     foreach (var item in list) 
     { 
      bindingList.Add(item); 
     } 

     return bindingList; 
    } 
} 
+0

Esa es la forma en que lo haría ... tal vez incluso desde IEnumerable (todo lo que usted hace es foreach) –

+0

Sí, IEnumerable sería mejor. –

+0

cierto. Gracias por las sugerencias –

11

¿No sería esto más simple?

public static class Extensions 
{ 
    public static BindingList<T> ToBindingList<T>(this IList<T> list) 
    { 
     return new BindingList<T>(list); 
    } 
} 

Es tan simple que no necesitamos un método de extensión ...

Me estoy perdiendo algo?

+0

Claro, esto es mejor. –

+0

¿Por qué se te permite hacer eso? ¿Hay un constructor en BindingList que toma una matriz como argumento y hace un BindingList fuera de ella? – CodyBugstein

+0

@Imray no es una matriz, es un 'IList', y hay un constructor que la acepta como argumento: http://referencesource.microsoft.com/#System/compmod/system/componentmodel/BindingList.cs,4f2405ea796059fa , referencias línea 65 –

Cuestiones relacionadas