the*_*ist 10 c# casting c#-4.0
我将json字符串反序列化List<ClassB>,现在我想List<ClassA>在将它从BindModel方法返回之前将其
强制转换.我需要进行转换,因为方法需要得到List<ClassA>.
为什么我在施法时遇到错误?毕竟,ClassB继承自ClassA.我该怎么办?
PS这个问题从这篇文章扩展而来.在行中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; }
}
Run Code Online (Sandbox Code Playgroud)
Ali*_*tad 10
您可以使用
Cast<T>()
Run Code Online (Sandbox Code Playgroud)
例如:
List<A> listOfA = new List<B>().Cast<A>();
Run Code Online (Sandbox Code Playgroud)
这实际上不如Linq,而是实现IEnumerable而不是IEnumerable<T>但仍然有用.它没有效率,因为正如我所说,它试图投射它.
记住列表不允许协方差,这是一个麻烦.最好使用IEnumerable<T>as而不是List.
你可以说:
IEnumerable<B> listOfB = new List<B>();
IEnumerable<A> listOfA = listOfB; // no casting required
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4924 次 |
| 最近记录: |