首页 > 解决方案 > 如何在 C# 中将 Child 类型转换为 Parent 对象

问题描述

我有一个ASP.Net Core 2.1 C#应用程序。

这就是我的 DTO 的样子。

public class Movie
{
  public int Id { get; set;}

  public bool IsSpecial {get; set;}

  public IEnumerable<Ticket> Tickets{ get; set;}
}

门票(基层)

 public class Ticket
 {
   public int Id { get; set;}

   public string Name { get; set;}

   public decimal price { get; set;}
 } 

TicketsSpecial(儿童/派生类)

 public class TicketsSpecial : Ticket
 {
    public string SpecialProp1 { get; set;}

    public string SpecialProp2 { get; set;}

 }

WebAPI 控制器

public class MovieController : ControllerBase
{

  public IActionResult Post([FromBody]Movie movie)
  {
      if(movie.IsSpecial)
      {
         var tickets = movie.Tickets;
         movie.Tickets = new List<TicketsSpecial>(); 
        movie.Tickets = tickets;
         SomeMethod(movie.Tickets);// throws run time error
         movie.Tickets = tickets;
      }
  }

  private bool SomeMethod(IEnumerable<TicketSpecial> tickets)
  {
  }
}

即时通讯

无法转换类型为“System.Collections.Generic.List 1[Ticket]' to type 'System.Collections.Generic.List1 [TicketSpecial]”的对象

此外,TicketSpecial 的额外属性不可用,因为它不存在于 Ticket 类中。

所以我反之亦然

public class Movie
{
  public int Id { get; set;}

  public IEnumerable<TicketSpecial> Tickets{ get; set;}
}

这样,我得到了额外字段的值,即。门票特殊道具。但是在进行类型转换时又会引发错误。

public IActionResult Post([FromBody]Move movie)
  {
      if(!movie.IsSpecial)
      {
         var tickets = movie.Tickets;
         movie.Tickets = new List<Ticket>();//throws Compile time error 

      }
  }

但这会引发错误,因为 CS0266 无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(您是否缺少演员表?)

move.IsSpecial我想用#2(第二种方式)来解决这个问题,因为如果是真的,我会有额外的 props 值

如何处理这种类型转换?谢谢!

标签: c#asp.net-core-2.1

解决方案


必须准备一份来自电影的特殊门票清单。门票并传递给消费者

var specialTickets = new List<TicketsSpecial>();
specialTickets.AddRange(movie.Tickets.OfType<TicketsSpecial>());
SomeMethod(specialTickets);

在您的示例中,第二个分配将门票属性分配回原来的门票列表,而不是特殊门票。


推荐阅读