我有一个类似于以下内容的构造函数:
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");
}
答案 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属性访问基础投诉的属性?