如何在C#中将子类型转换为父对象>> [

问题描述 投票:0回答:1
我有一个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) { } }

RTE

无法投射类型为'System.Collections.Generic.List1[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'。存在显式转换(您是否缺少演员表?)

我想用#2(第二种方式)解决此问题,因为在move.IsSpecial为true的情况下,我将拥有额外的props值]如何处理这种类型转换?谢谢!

我有一个ASP.Net Core 2.1 C#应用程序。这就是我的DTO的样子。公共类电影{public int Id {get; set;} public bool IsSpecial {get; set;} public IEnumerable

... ...>

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

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

在您的示例中,第二个分配将票证属性分配回原始票证属性,它是票证列表,而不是特殊票证。
c# asp.net-core-2.1
1个回答
0
投票
必须准备电影中的特殊门票清单。门票并传递给消费者

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

© www.soinside.com 2019 - 2024. All rights reserved.