Как создать коллекцию / класс на основе свойства в C # - PullRequest
1 голос
/ 14 октября 2019

Ниже приведены мои 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
}

и т. Д.

Теперь на основе логического свойства, присутствующего в Movie, необходимо соответствующим образом инициализировать коллекцию Ticket.

Одна такая попытка: -

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

Но при этом, когда я отлаживаю, я не вижу никаких сообщений об ошибках, просто отладка останавливается

В действительности это все DTO для API. Так же попробовал это.

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)
  {
  }
}

Также хотел узнать, добавляются ли свойства вBasicTicket (если n = 2 или 3) на лету, используя ExpandoObject, было бы хорошо или нет?

Я думаю, что был бы какой-то шаблон проектирования, который бы правильно относился к созданию этого объекта, но пока ничего не нашел.

Спасибо!

1 Ответ

1 голос
/ 14 октября 2019

Ваша реализация недвижимости ошибочна. Эта реализация приведет к возникновению StackOverflowException в методе доступа get (возможно, именно поэтому ваш отладчик останавливается, не показывая никакой ошибки) и nop в методе доступа set.

Правильный способ реализации свойства с помощьювспомогательное поле:

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>());
       }
    }
}

Подробнее о свойствах с вспомогательными полями: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties#properties-with-backing-fields

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...