C# 如何基于C中的属性实例化集合/类#
下面是我的DTOC# 如何基于C中的属性实例化集合/类#,c#,design-patterns,C#,Design Patterns,下面是我的DTO public class Movie { public int Id {get; set;} public string Name {get; set;} public IEnumerable<BasicTicket> Tickets { get; set;} } 1. 2. &诸如此类 现在,根据电影中的布尔属性,将相应地初始化票证集合 其中一次尝试:- public IEnumerable<BasicTicket> Tickets
public class Movie
{
public int Id {get; set;}
public string Name {get; set;}
public IEnumerable<BasicTicket> Tickets { get; set;}
}
1.
2.
&诸如此类
现在,根据电影中的布尔属性,将相应地初始化票证集合
其中一次尝试:-
public IEnumerable<BasicTicket> Tickets {
get { return Tickets;}
set
{
if(this.IsSpecial)
{
value = new List<SpecialTicket >();
}
else
{
value = new List<BasicTicket>();
}
}
公共IEnumerable票据{
获取{回程票;}
设置
{
如果(这是特别的)
{
值=新列表();
}
其他的
{
值=新列表();
}
}
但这样做时,当我调试时,我没有看到任何错误消息,只是简单地停止调试
实际上,这些都是API的DTO。所以也尝试了这个
WebAPI Controller
public class MovieController : ControllerBase
{
public IActionResult Post([FromBody]Movie movie)
{
if(movie.IsSpecial)
{
var tickets = movie.Tickets;
movie.Tickets = new List<SpecialTicket>();
movie.Tickets = tickets; // Throws error or doesn't get the values of the props present in TicketSpecial
movie.Tickets = tickets;
}
}
private bool SomeMethod(IEnumerable<TicketSpecial> tickets)
{
}
}
WebAPI控制器
公共级电影控制器:ControllerBase
{
公共IActionResult帖子([FromBody]电影)
{
如果(电影,特别)
{
var票证=电影票;
movie.Tickets=新列表();
movie.Tickets=Tickets;//抛出错误或未获取TicketSpecial中存在的道具值
电影。票=票;
}
}
私有bool SomeMethod(IEnumerable票据)
{
}
}
谢谢!您的属性实现是错误的。此实现将导致
get
访问器中出现StackOverflowException(可能这就是调试器停止而不显示任何错误的原因)和集
访问器中出现nop
使用支持字段实现属性的正确方法是:
private IEnumerable<Ticket> _tickets;
public IEnumerable<Ticket> Tickets
{
get { return _tickets;}
set
{
if(this.IsSpecial)
{
_tickets = new List<TicketSpecial>(value.Cast<TicketSpecial>());
}
else
{
_tickets = new List<Ticket>(value.Cast<Ticket>());
}
}
}
私人IEnumerable\u门票;
公众票
{
获取{返回}
设置
{
如果(这是特别的)
{
_票证=新列表(value.Cast());
}
其他的
{
_票证=新列表(value.Cast());
}
}
}
关于支持字段属性的更多信息:您应该修改您的问题,您的代码中有一些属性,如movie.IsSpecial,这是不存在的。例如TicketSpecial和SpecialTicket,这些属性称为“Ticket”不存在,等等。您正在使用实体,其中类与数据库之间存在映射。类必须映射到数据库中的现有表,如果添加或更改类或数据库,则需要更新映射。如果没有与数据库的连接,则写入也将失败。编译检查如果类与映射表匹配,但未验证数据库是否与映射匹配。如果映射不正确,则在读取/写入数据库时将出现运行时错误。
Tickets
的getter是递归的……我假设您不希望这样。请使用备份字段。\u Tickets=new List(value);
这是抛出编译时错误CS1503参数1:无法从'System.Collections.Generic.IEnumerable'转换为'System.Collections.Generic.IEnumerable'
是的,对不起,我错过了列表构造中的转换。我编辑了我的答案。这样做,抛出运行时错误,因为无法将'BasicTicket'类型的对象转换为键入“SpecialTicket”。
这就是为什么您要将BasicTicket
的集合分配给Tickets
属性(而不将它们转换为SpecialTicket
)。此时,我不完全确定您想做什么。。。
public IEnumerable<BasicTicket> Tickets {
get { return Tickets;}
set
{
if(this.IsSpecial)
{
value = new List<SpecialTicket >();
}
else
{
value = new List<BasicTicket>();
}
}
WebAPI Controller
public class MovieController : ControllerBase
{
public IActionResult Post([FromBody]Movie movie)
{
if(movie.IsSpecial)
{
var tickets = movie.Tickets;
movie.Tickets = new List<SpecialTicket>();
movie.Tickets = tickets; // Throws error or doesn't get the values of the props present in TicketSpecial
movie.Tickets = tickets;
}
}
private bool SomeMethod(IEnumerable<TicketSpecial> tickets)
{
}
}
private IEnumerable<Ticket> _tickets;
public IEnumerable<Ticket> Tickets
{
get { return _tickets;}
set
{
if(this.IsSpecial)
{
_tickets = new List<TicketSpecial>(value.Cast<TicketSpecial>());
}
else
{
_tickets = new List<Ticket>(value.Cast<Ticket>());
}
}
}