如何简化设置对象的多个属性的C#代码?

时间:2011-07-18 07:16:32

标签: c# coding-style

我的代码如下:

itemView.Question.AnswersJSON = itemView.Answer.ToJSONString();
itemView.Question.Modified = DateTime.Now;
itemView.Question.ModifiedBy = User.Identity.Name

加上更多行,我为Question内的itemView类设置了值。

我认为答案是“不可能”,但只是把它作为一个问题,以防任何人知道某种方式。

我想要做的是找到一种简化此代码的方法,而不必在每一行中重复itemView.Question

5 个答案:

答案 0 :(得分:22)

您是否将itemView.Question实例化为方法的一部分?

如果是这样,你可以这样做: -

itemView.Question = new ItemViewQuestion()
{
  AnswersJSON = itemView.Answer.ToJSONString(),
  Modified = DateTime.Now,
  ModifiedBy = User.Identity.Name
};

答案 1 :(得分:13)

如果Questionclass(不是struct),那么您可以将其分配给本地变量,并编辑:

Question q = itemView.Question;
q.AnswersJSON = itemView.Answer.ToJSONString();
q.Modified = DateTime.Now;
q.ModifiedBy = User.Identity.Name

您甚至不必将q分配回itemView.Question

这是因为C#中的类是reference types。如果将引用类型的实例分配给局部变量,或将其传递给函数,则对该实例的更改将反映在您对该同一实例的引用的任何位置。

修改

请注意,如果QuestionitemView的属性而不是字段,则情况可能有点模糊。根据实施方式,您可能需要将q分配回Question。在这种情况下,这个代码仍然是首选,以避免重复调用Question属性的getter方法。

答案 2 :(得分:11)

一个选项是您可以将属性转换为返回'this'的方法。

然后你可以写:

itemView.Question
    .AnswersJSON(itemView.Answer.ToJSONString())
    .Modified(DateTime.Now)
    .ModifiedBy(User.Identity.Name);

我听说过这种称为“流畅的界面”的风格,并且发现它非常方便。我有时创建属性和匹配的set方法,返回'this',称为SetXXXX,以补充它们。

用于单元测试的流行Rhino Mocks框架使用它。这里有更多示例:http://www.codeproject.com/Articles/99542/Guidelines-to-Fluent-Interface-design-in-C-Part-1

答案 3 :(得分:4)

如果该课程是一个课程,那么您可以稍微缩短代码:

    var q = itemView.Question;
    q.AnswersJSON = itemView.Answer.ToJSONString();
    q.Modified = DateTime.Now;
    q.ModifiedBy = User.Identity.Name

答案 4 :(得分:4)

根据您对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);