2009-01-08 3 views
18

Ich bin mir sicher, dass ich das schon mal gemacht habe, finde aber kein Beispiel dafür! Grrr ...Generische Methode in einer nicht-generischen Klasse?

Zum Beispiel möchte ich eine IList<T> in eine BindingList<T> konvertieren:

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

Was ist die eigentliche Frage hier? Ja, generische Methoden sind in nicht-generischen Klassen in Ordnung (System.Linq.Enumerable ist wahrscheinlich das größte Beispiel). –

+2

@Jon - er verpasst die in ToBindingList –

Antwort

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

Sie können dies tun, indem Erweiterungsmethode, und es wäre besser.

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

Das ist die Art, wie ich es tun würde ... vielleicht sogar von IEnumerable (Sinc alles, was Sie tun, ist foreach) –

+0

Ja, IEnumerable wäre besser. –

+0

Wahr. Danke für Tipps –

11

Wäre das nicht einfacher?

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

Es ist so einfach, dass wir eine Erweiterungsmethode nicht brauchen ...

ich etwas fehle?

+0

Sicher, das ist besser. –

+0

Warum darfst du das tun? Gibt es in BindingList einen Konstruktor, der ein Array als Argument akzeptiert und daraus eine BindingList erstellt? – CodyBugstein

+0

@Imray ist es kein Array, es ist ein 'IList', und es gibt einen Konstruktor, der es als Argument akzeptiert: http://referencesource.microsoft.com/#System/compmod/system/componentmodel/BindingList.cs,4f2405ea796059fa , Bezugslinie 65 –