当ClassB从ClassA继承时,如何将List <ClassB>转换为List <ClassA>?

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)


Ray*_*Ray 6

您可以使用Cast方法.

return list.Cast<ClassB>();

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