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



我的代码看起来像这样:

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

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

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

你甚至不需要将q赋值给itemView.Question

这是因为c#中的类是引用类型。如果将引用类型的实例赋值给局部变量,或将其传递给函数,则对该实例的更改将在引用该实例的任何地方反映出来。

编辑

注意,如果QuestionitemView的属性,而不是一个字段,情况可能会有点模糊。根据它的实现方式,您可能必须将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;
    }
}

最新更新