当ClassB从ClassAinheritance时,如何将List 转换为List ?
我将json字符串反序列化为List
,现在我想在将它从BindModel
方法返回之前将其BindModel
为List
。 我需要进行转换,因为方法需要获取List
。
为什么我在投票时会收到错误? 毕竟, ClassB
inheritance自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
创建List
, List
是不够的,正如其他答案所指出的那样。 您需要构建一个新列表。
我对其他答案建议的代码并不是特别满意,所以我提供了自己的解决方案。 我会这样做:
var baseClassList = new List(derivedClassList.Cast ());
有人可能更喜欢这个:
var baseClassList = derivedClassList.Cast().ToList();
我更喜欢第一个,因为它可以很容易地将类型从List
更改为使用带有IEnumerable
的构造函数的任何其他集合。
上述就是C#学习教程:当ClassB从ClassAinheritance时,如何将List 转换为List ?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/960732.html