簡體   English   中英

C#將對象轉換為基類列表

[英]C# Cast Object to List of Base Class

我有以下類結構:

public class Fruit { }
public class Apple : Fruit { }

然后我使用.net框架中的一個方法,該方法從作為對象返回的類中獲取屬性值。 所以,

// values will be of type List<Apple>
object values = someObject.GetValue()

我現在有了List類型的這個值對象,我想將它轉換為類型為Fruit的List。 我試過以下但是沒有用。

List<Fruit> fruits = values as List<Fruit>;

任何人都知道如何將對象轉換為其基類的List?

更新:在轉換時我不知道值對象是List類型我知道它應該是一個繼承自Fruit的類型的List。

問題是List<Apple>List<Fruit>不是共變體。 您首先必須轉換為List<Apple> ,然后使用LINQ的Cast方法將元素轉換為Fruit

List<Fruit> fruits = values is List<Apple> ? 
    (values as List<Apple>).Cast<Fruit>().ToList() :
    new List<Fruit>();

如果您不提前知道類型並且不需要修改列表(並且您使用的是C#4.0),則可以嘗試:

IEnumerable<Fruit> fruits = values as IEnumerable<Fruit>;

或者,我想,如果你需要一個List:

List<Fruit> fruits = (values as IEnumerable<Fruit>).ToList();

你應該嘗試linq cast方法 Cast方法將返回您正在投射的類型的IEnumerable ...

   List<Fruit> fruits = null;
   if ( values is List<Apples> ) 
     fruits = ((List<Apples>)values).Cast< fruits >.ToList();

既然你說你知道這個對象是一個水果列表,但你不知道它是哪個水果的列表,你可以這樣做:

List<Fruit> fruits = ((IEnumerable)values).Cast<Fruit>().ToList();

如果您使用的是.NET 4(不包括Silverlight 4),則可以使用Justin Niessner的解決方案:

List<Fruit> fruits = ((IEnumerable<Fruit>)values).ToList();

最后,如果有一個調用站點,其中已知水果的靜態類型(Apple或其他),則可以使用通用解決方案。 這意味着要更改代碼,以便您不再使用反射獲取值。

另一種通用方法是創建泛型方法並通過在對象上調用GetType()在運行時構造它,但這可能是治愈比疾病更糟糕的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM