C#构造函数中更简洁的语法?

时间:2009-06-09 11:46:44

标签: c# entity-framework

我有一个类似于以下内容的构造函数:

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 个答案:

答案 0 :(得分:3)

好吧,你可以使用静态方法而不是构造函数:

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

                    });
}

答案 1 :(得分:0)

不是天生的。您可以将投诉对象存储在类中,并让所有属性指向它,而不是从构造函数中设置它们。

例如

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

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

    // ...etc
}

如果m_Complaint上没有setter,可能会变得更复杂 - 保留可空的支持字段,并在访问m_Complaint属性之前检查它

答案 2 :(得分:0)

我相信你可以尝试这样的事情:


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技巧应该会有所帮助,但它可能会变得多余。 此外,与您当前的解决方案相比,这样的代码有点混淆。我相信你的代码很好。

答案 3 :(得分:0)

我认为你试图避免将所有这些属性设置两次,因为对结构的任何更改都要求你在两个地方更新属性,这是正确的吗?您可以尝试使用一些反射将属性从一个实例复制到另一个实例。

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())
    ...

答案 4 :(得分:0)

将投诉对象作为成员变量,并且get / set属性访问基础投诉的属性?