c# - 如何在 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.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”。存在显式转换(您是否缺少演员表?)
move.IsSpecial
我想用#2(第二种方式)来解决这个问题,因为如果是真的,我会有额外的 props 值
如何处理这种类型转换?谢谢!
解决方案
必须准备一份来自电影的特殊门票清单。门票并传递给消费者
var specialTickets = new List<TicketsSpecial>();
specialTickets.AddRange(movie.Tickets.OfType<TicketsSpecial>());
SomeMethod(specialTickets);
在您的示例中,第二个分配将门票属性分配回原来的门票列表,而不是特殊门票。
推荐阅读
- c# - Azure 存储 SAS 签名不匹配,如何生成 SAS 令牌?
- multithreading - 是否有必要在不同线程中运行的 libuv 循环上下文中进行锁定/线程同步
- bash - 如何从给定的 URL 中找到 NGINX+ 端点
- node.js - 如何将 MetaMask 与 Web3.js 版本 1.2.6 连接?
- django - Django Rest Framework - OneToOne 反向关系
- ios - UIcollection 视图动态高度但固定宽度
- python - 如何使用 python 脚本获取 Azure DevOps 客户端
- reactjs - 如何防止 create-react-app 中的collapseWhitespace
- google-cloud-platform - 共享 VPC 和 VPC 对等互连组合
- apache-kafka - kafka-consumer-groups.sh 没有显示 KafkaTool 所做的所有组