var specialTickets = new List<TicketsSpecial>();
specialTickets.AddRange(movie.Tickets.OfType<TicketsSpecial>());
SomeMethod(specialTickets);
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.List
1 [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(第二种方式)解决此问题,因为在 我有一个ASP.Net Core 2.1 C#应用程序。这就是我的DTO的样子。公共类电影{public int Id {get; set;} public bool IsSpecial {get; set;} public IEnumerable ... ...>move.IsSpecial
为true的情况下,我将拥有额外的props值]如何处理这种类型转换?谢谢!
var specialTickets = new List<TicketsSpecial>();
specialTickets.AddRange(movie.Tickets.OfType<TicketsSpecial>());
SomeMethod(specialTickets);
在您的示例中,第二个分配将票证属性分配回原始票证属性,它是票证列表,而不是特殊票证。
var specialTickets = new List<TicketsSpecial>();
specialTickets.AddRange(movie.Tickets.OfType<TicketsSpecial>());
SomeMethod(specialTickets);