2009-12-10 15 views
9

Z jakiegoś powodu mój szef lubi tworzyć niestandardowe typy do reprezentowania ogólnej listy (nawet w większości przypadków, gdy jego niestandardowy typ ma członków myślę, że on jest po prostu leniwy i nie lubi wpisywać listy lub coś ale dla mnie to jest kulawy i powoduje mi wiele bólu głowy na poniższej kwestiiNie można odlać obiektu typu "System.Collections.Generic.List`1 [Element]", aby wpisać "ItemList"

Punkt w przypadku:.

public class ItemnList : List<Item> 
{ 
    public Personalization FindById(int id) 
    { 
     ...blahblah blah, this is really an extension method that should be elsewhere 
    } 

} 

W związku z tym, gdy używam standardowej listy (mabye nienawidzę jego niestandardowej klasy i lubię używać prostych typów .NET, tak jak powinny być używane), LUB może używam wyrażeń LINQ takich jak b elow, zawsze napotkasz problemy odlewniczych choć niestandardowy typ dziedziczy z tej listy

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

    return itemList; 
    .... 
} 
+0

Co to jest dokładnie tutaj? –

+0

Błąd, który dostaję ... który znajduje się w tytule wpisu – PositiveGuy

+1

Przykład, w którym jest to konieczne, w WinForm dla wiązania. Jeśli chcesz używać projektantów, musisz mieć określoną klasę. Jest to szczególnie przydatne podczas korzystania z kontrolek innych firm, takich jak Infragustics. – fuzzbone

Odpowiedz

6

Jak Grzenio points out, nie można używać ToList() i obsady, jednak można stworzyć swoją własną metodę rozszerzenia aby utworzyć wystąpienie typu pochodzącego z sekwencji:

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

Tak dla przykładu wy zrobiłby:

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

Dałem tę odpowiedź, ponieważ jest ponad moją głową, więc był to dobry przykład do wyjaśnienia "wywnioskowanego" rozwiązania. Nie jestem jeszcze guru w zakresie ogólnych metod. – PositiveGuy

+0

To zadziałało również dla mnie ... dzięki. –

2

Niestety ToList() zwróci normalną listę, a nie ItemnList, więc nie można go rzucić. Naprawdę nie widzę sensownego obejścia tego problemu, lepiej byłoby raczej zamknąć listę w ItemnList, zamiast tego wyprowadzić z niej.

+1

co masz na myśli mówiąc o enkapsulacji listy w ItemList? – PositiveGuy

+1

co masz na myśli przez "normalną listę" ... niezliczoną liczbę? – PositiveGuy

Powiązane problemy