2009-12-10 10 views
9

Aus irgendeinem Grund mag mein Chef benutzerdefinierte Typen erstellen, um eine generische Liste darzustellen (sogar in den meisten Fällen wo seine individuelle Art hat keine Mitglieder ich glaube, er nur faul ist und nicht wie, aber die Liste oder etwas geben mir diese lahm ist und verursacht mir viele Kopfschmerzen pro das Thema unterKann Objekt des Typs 'System.Collections.Generic.List`1 [Item]' nicht umwandeln, um 'ItemList' einzugeben

Punkt bei:.

Folglich, wenn ich eine Standardliste verwende (binye ich hasse seine benutzerdefinierte Klasse und gerne einfache .NET-Typen wie sie verwendet werden sollen), ODER vielleicht verwende ich einen LINQ-Ausdruck wie b elow, ich laufe in Gießproblemen immer, auch wenn die benutzerdefinierten Typ aus dieser Liste

private ItemList someMethod(ItemList itemList) 
{ 
    ... 
    itemList = (ItemList)items.Where(x => x.ItemType != ItemType.Car && x.ItemType != ItemType.Truck).ToList(); 

    return itemList; 
    .... 
} 
+0

Was genau ist die Frage hier? –

+0

Der Fehler, den ich bekomme ... was in der Post ist Titel – PositiveGuy

+1

Ein Beispiel, wo dies erforderlich ist, ist in Winforms für die Bindung. Wenn Sie die Designer verwenden möchten, müssen Sie eine bestimmte Klasse haben. Dies ist besonders praktisch, wenn Sie Steuerelemente von Drittanbietern wie z. B. Infragustics verwenden. – fuzzbone

Antwort

6

Als Grzenio points out, können Sie nicht verwenden ToList() und gegossen, aber könnten Sie Ihre eigene Erweiterungsmethode erstellen aus einer Sequenz, die eine Instanz des abgeleiteten Typs zu schaffen:

public static TDerived CreateFromEnumerable<TDerived, T>(this IEnumerable<T> seq) where TDerived : List<T>, new() 
     { 
      TDerived outList = new TDerived(); 
      outList.AddRange(seq); 
      return outList; 
     } 

So für Ihr Beispiel Sie würde tun:

ItemList outList = itemList 
    .Where(x => x.ItemType != ItemType.Car && x.ItemType != ItemType.Truck) 
    .CreateFromEnumerable<ItemList, Item>(); 
+1

Ich gab dies die Antwort, weil es über meinem Kopf ist und so war dies ein gutes Beispiel, um die "abgeleitete" Lösung zu erklären. Ich bin noch kein Guru für generische Methoden. – PositiveGuy

+0

Das hat auch für mich funktioniert ... danke. –

2

Leider ToList() eine normale Liste, und nicht ItemnList kehrt erbt, so dass Sie nicht es werfen kann. Ich sehe keine vernünftige Problemumgehung, es wäre wahrscheinlich besser, die Liste in ItemnList zu kapseln, statt davon abzuleiten.

+1

Was meinst du damit, die Liste in ItemList einzukapseln? – PositiveGuy

+1

was meinst du mit "normale Liste" ... ein IEnumerable? – PositiveGuy

Verwandte Themen