Более краткий синтаксис в конструкторе C #? - PullRequest
0 голосов
/ 09 июня 2009

У меня есть конструктор, похожий на следующий:

using Microsoft.Data.Extensions;

public class Complaint
{
  public int Id {get; set;}
  public int Transcript {get; set;}
  //... etc. ... Lots more properties

  public Complaint(int id)
  {
    var command = dataContext.CreateStoreCommand(
                     "dbo.stp_Complaint_Get", 
                     CommandType.StoredProcedure, 
                     new SqlParameter("Id", id));

    var complaint = command.Materialize(x =>
                        new Complaint
                        {
                          Id = x.Field<int>("Id"),
                          Transcript = x.Field<string>("Transcript");
                          //... etc. ... Lots more fields from db

                        }

    this.Id = complaint.Id;
    this.Transcript = complaint.Transcript;
    //... etc. ... Lots more properties to set

  }

}

Есть ли в C # синтаксис, который позволил бы мне выполнять последнюю часть за один шаг вместо двух? то есть концептуально что-то вроде этого:

this = command.Materialize(x =>
                   new Complaint
                   {
                      Id = x.Field<int>("Id"),
                      Transcript = x.Field<string>("Transcript");
                   }

Ответы [ 5 ]

3 голосов
/ 09 июня 2009

Ну, вы можете использовать статический метод вместо конструктора:

public static Complaint FromId(int id)
{
   var command = dataContext.CreateStoreCommand(
                 "dbo.stp_Complaint_Get", 
                 CommandType.StoredProcedure, 
                 new SqlParameter("Id", id));

   return command.Materialize(x =>
                    new Complaint
                    {
                      Id = x.Field<int>("Id"),
                      Transcript = x.Field<string>("Transcript");
                      //... etc. ... Lots more fields from db

                    });
}
0 голосов
/ 09 июня 2009

Имеет ли объект жалобы переменную-член, а свойства get / set получают доступ к свойствам базовой жалобы?

0 голосов
/ 09 июня 2009

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

var complaint = command.Materialize(x =>
                        new Complaint
                        {
                          Id = x.Field<int>("Id"),
                          Transcript = x.Field<string>("Transcript");
                          //... etc. ... Lots more fields from db

                        }

foreach (var prop in typeof(Complaint).GetProperties())
    ...
0 голосов
/ 09 июня 2009

Полагаю, вы можете попробовать что-то вроде этого:


var currentInstance = this;
var complaint = command.Materialize(x =>
                        new Complaint
                        {
                          Id = currentInstance.Id = x.Field("Id"),
                          Transcript = currentInstance.Transcript = x.Field("Transcript");
                          //... etc. ... Lots more fields from db

                        });

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

0 голосов
/ 09 июня 2009

Не по своей сути. Вы можете хранить объект жалобы внутри класса, и все свойства указывают на это, а не задают их все из конструктора.

например

public class Complaint
{
    private readonly {type of complaint} m_Complaint;        

    public int Id
    {
         get { return m_Complaint.Id; }
    }

    // ...etc
}

Вы можете усложнить ситуацию, если у вас нет установщика для m_Complaint - сохраните пустые поля поддержки и проверьте это перед доступом к свойствам m_Complaint

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