[英]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.