Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何基于C中的属性实例化集合/类#_C#_Design Patterns - Fatal编程技术网

C# 如何基于C中的属性实例化集合/类#

C# 如何基于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

下面是我的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 { 
     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票据)
{
}
}
另外,想知道使用ExpandoObject动态地向BasicTicket添加属性(如果n=2或3)是否合适

我认为会有一些设计模式,可以正确地解决这个对象的创造性,但还没有找到任何东西


谢谢!

您的属性实现是错误的。此实现将导致
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>());
       }
    }
}