我将 json 字符串反序列化为List<ClassB>
现在我想把它投射到List<ClassA>
在我返回它之前BindModel
方法。我需要强制转换,因为这些方法期望得到List<ClassA>
.
为什么我在投射时出现错误?毕竟,ClassB
继承自ClassA
。我应该怎么办?
附:这个问题是从这个帖子。排队new DataContractJsonSerializer(typeof(List<ClassB>));
代替List<ClassB>
该类型将在运行时构造。
public override object BindModel(...)
{
var serializer = new DataContractJsonSerializer(typeof(List<ClassB>));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("[{\"id\":\"1\",\"name\":\"name\"}]"));
var list = serializer.ReadObject(ms);
return (List<ClassA>)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<T>()
例如:
List<A> listOfA = new List<B>().Cast<A>();
这其实是不如 Linq并实施于IEnumerable
而不是IEnumerable<T>
但仍然有用。这是效率不高因为正如我所说,它尝试投射它。
记住列表不允许协方差这是一个麻烦。最好使用IEnumerable<T>
作为接口而不是列表。
你可以说:
IEnumerable<B> listOfB = new List<B>();
IEnumerable<A> listOfA = listOfB; // no casting required
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)