我的代码看起来像这样:
itemView.Question.AnswersJSON = itemView.Answer.ToJSONString();
itemView.Question.Modified = DateTime.Now;
itemView.Question.ModifiedBy = User.Identity.Name
加上我为itemView
内部的Question
类设置值的更多行。
我认为答案是"不可能",但只是把它作为一个问题,以防有人知道一个方法。
我想做的是找到一种方法来简化这段代码,而不是在每行重复itemView.Question
是否实例化itemView。有什么问题吗?
如果可以,你可以这样做:-
itemView.Question = new ItemViewQuestion()
{
AnswersJSON = itemView.Answer.ToJSONString(),
Modified = DateTime.Now,
ModifiedBy = User.Identity.Name
};
你可以把你的属性转换成返回'this'的方法。
那么你可以写:
itemView.Question
.AnswersJSON(itemView.Answer.ToJSONString())
.Modified(DateTime.Now)
.ModifiedBy(User.Identity.Name);
我听说这种风格被称为"流畅的接口",并且发现它非常方便。我有时创建属性和一个匹配集方法返回'this'称为SetXXXX来补充它们。
用于单元测试的流行Rhino Mocks框架使用它。这里有更多的例子:http://www.codeproject.com/Articles/99542/Guidelines-to-Fluent-Interface-design-in-C-Part-1如果Question
是class
(不是struct
),那么您可以将其分配给本地变量,并编辑:
Question q = itemView.Question;
q.AnswersJSON = itemView.Answer.ToJSONString();
q.Modified = DateTime.Now;
q.ModifiedBy = User.Identity.Name
你甚至不需要将q
赋值给itemView.Question
。
这是因为c#中的类是引用类型。如果将引用类型的实例赋值给局部变量,或将其传递给函数,则对该实例的更改将在引用该实例的任何地方反映出来。
编辑
注意,如果Question
是itemView
的属性,而不是一个字段,情况可能会有点模糊。根据它的实现方式,您可能必须将q
分配回Question
。在这种情况下,为了避免重复调用Question
属性的getter方法,仍然更倾向于使用下面的代码。
根据您对Question
类的控制程度,分离设置元数据的责任可能是一个想法:
class Question {
...
public void SetAnswer(Answer answer) {
this.AnswersJSON = answer.ToJSONString();
this.Modified = DateTime.Now;
this.Modified = User.Identity.Name; // or pass the user into SetAnswer()
}
}
// in your UI code:
itemView.Question.SetAnswer(itemView.Answer);
如果这个问题是一个类,那么你可以把代码缩短一点:
var q = itemView.Question;
q.AnswersJSON = itemView.Answer.ToJSONString();
q.Modified = DateTime.Now;
q.ModifiedBy = User.Identity.Name
我有这个我喜欢使用的Apply
扩展方法,用于将LINQ lambda表达式应用于对象。您可以使用它来比原始代码更简洁地分配多个属性:
itemView.Question.Apply(x => {
x.AnswersJSON = itemView.Answer.ToJSONString();
x.Modified = DateTime.Now;
x.ModifiedBy = User.Identity.Name
});
public static class Helpers
{
public static T Apply<T>(this T self, Action<T> lambda)
{
lambda(self);
return self;
}
}