当ClassB从ClassAinheritance时,如何将List 转换为List ?

我将json字符串反序列化为List ,现在我想在将它从BindModel方法返回之前将其BindModelList 。 我需要进行转换,因为方法需要获取List

为什么我在投票时会收到错误? 毕竟, ClassBinheritance自ClassA 。 我该怎么办?

PS这个问题从这篇文章扩展而来。 在线new DataContractJsonSerializer(typeof(List)); 而不是List ,将在运行时构造类型。

  public override object BindModel(...) { var serializer = new DataContractJsonSerializer(typeof(List)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("[{\"id\":\"1\",\"name\":\"name\"}]")); var list = serializer.ReadObject(ms); return (List)list; } [KnownType(typeof(ClassA))] [DataContract] public class ClassA { public ClassA(); } [KnownType(typeof(ClassB))] [DataContract] public class ClassB : ClassA { [DataMember(Name = "id")] public int Id { get; set; } [DataMember(Name = "name")] public string CategoryName { get; set; } } 

您可以使用

  Cast() 

例如:

  List listOfA = new List().Cast(); 

这实际上不如Linq,并且在IEnumerable而不是IEnumerable但仍然有用。 它没有效率,因为正如我所说,它试图施展它。

记住列表不允许协方差 ,这是一个麻烦。 最好使用IEnumerable作为接口而不是List。

你可以说:

  IEnumerable listOfB = new List(); IEnumerable listOfA = listOfB; // no casting required 

您可以使用Cast方法 。

return list.Cast();

看看有关Co和Contra Variance的这个问题

我会像这样投射列表:

 var listB = GetListOfB(); // returns List var listA = listB.Select(q => (A)q).ToList(); 

这对你有用吗?

您不能将子类型列表强制转换为SuperType列表。 假设我有一个Tortoises列表,我可以把它放到一个动物列表中。 然后我可以将一只狮子添加到陆龟列表中,但狮子的类型不正确。

但是,使用enumerables,你可以做到这一点。 之前的海报非常正确地说您可以将子类型列表转换为IEnumerable的SuperType 。 实际上,在C#4中,IEnumerable SubType是一个IEnumerable的SuperType 。 这是因为generics参数被指定为out参数。

要从List创建ListList是不够的,正如其他答案所指出的那样。 您需要构建一个新列表。

我对其他答案建议的代码并不是特别满意,所以我提供了自己的解决方案。 我会这样做:

 var baseClassList = new List(derivedClassList.Cast()); 

有人可能更喜欢这个:

 var baseClassList = derivedClassList.Cast().ToList(); 

我更喜欢第一个,因为它可以很容易地将类型从List更改为使用带有IEnumerable的构造函数的任何其他集合。