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

问题描述 投票:0回答:1

下面是我的DTO。

public class Movie
{
  public int Id {get; set;}

  public string Name {get; set;}

  public IEnumerable<BasicTicket> Tickets { get; set;}

}

这是BasicTicket类型的票证的多种类型

public class BasicTicket
{
   public int Id {get; set;}

   public bool IsSpecial { get; set;}

   public bool IsDicount{get; set;}
   public decimal Price { get; set;}
}

1

public class SpecialTicket : BasicTicket
{
  public string SpecialProp1 {get; set;} //n such properties where n could be the range of 2 to 10
}

2

public class DiscountTicket : BasicTicket
{
  public string SomeProp1 {get; set;} //n such properties where n could be the range of 2 to 10
}

&依此类推

现在基于电影中存在的布尔属性,要相应地初始化票证的集合。

一种这样的尝试:-

public IEnumerable<BasicTicket> Tickets { 
     get { return Tickets;} 
     set 
     { 
       if(this.IsSpecial)
       {
           value = new List<SpecialTicket >();
       }
       else
       {
           value = new List<BasicTicket>();
       }
     }

但是这样做时,我调试时没有看到任何错误消息,只是调试停止了

实际上,所有这些都是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)
  {
  }
}

而且,想知道使用ExpandoObject快速向BasicTicket添加属性(如果n = 2或3)是否好?

我认为会有一些设计模式可以正确地解决此对象的创建问题,但尚未找到任何东西。

谢谢!

c# design-patterns
1个回答
1
投票

您的财产实施是错误的。此实现将导致get访问器中出现StackOverflowException(可能是为什么调试器停止而没有向您显示任何错误的原因),并导致set访问器中出现nop。

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