У меня есть приложение 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
верно
Как справиться с этой типизацией? Спасибо!