Как типизировать дочерний к родительскому объекту в C # - PullRequest
0 голосов
/ 14 октября 2019

У меня есть приложение 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;}
 } 

Билеты Special (Дочерний / производный класс)

 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)
  {
  }
}

RTE

Невозможно привести объект типа 'System.Collections.Generic.List 1[Ticket]' to type 'System.Collections.Generic.List 1 [TicketSpecial] '

Кроме того, дополнительные свойства TicketSpecial недоступны, так как его нет в классе Ticket.

, поэтому я попробовал наоборотВерсия

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

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

Идя по этому пути, я получаю значения дополнительных полей, т.е. TicketSpecial реквизит. Но опять же при приведении типов он выдает ошибку.

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». Существует явное преобразование (вам не хватает приведения?)

Я хочу решить эту проблему с помощью # 2 (второй способ), поскольку у меня будет дополнительное значение реквизита в случае move.IsSpecial верно

Как справиться с этой типизацией? Спасибо!

1 Ответ

0 голосов
/ 14 октября 2019

Необходимо подготовить список специальных билетов из фильма. Билеты и передать их потребителю

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

В вашем примере второе назначение присвоило свойству tickets обратно исходное, являющееся списком билетов. , не специальный билет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...