How can I simplify C# code that sets multiple properties of an object?

后端 未结 5 1183
没有蜡笔的小新
没有蜡笔的小新 2021-02-07 00:30

I have code that looks like this:

itemView.Question.AnswersJSON = itemView.Answer.ToJSONString();
itemView.Question.Modified = DateTime.Now;
itemView.Question.Mo         


        
相关标签:
5条回答
  • 2021-02-07 00:53

    If that Question is a class, then you could shorten the code a bit:

        var q = itemView.Question;
        q.AnswersJSON = itemView.Answer.ToJSONString();
        q.Modified = DateTime.Now;
        q.ModifiedBy = User.Identity.Name
    
    0 讨论(0)
  • 2021-02-07 00:57

    Depending on how much control you have over the Question class, separating the resposibility for setting that meta-data may be an idea:

    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);
    
    0 讨论(0)
  • 2021-02-07 00:58

    Do you instantiate itemView.Question as part of your method?

    If so you could do:-

    itemView.Question = new ItemViewQuestion()
    {
      AnswersJSON = itemView.Answer.ToJSONString(),
      Modified = DateTime.Now,
      ModifiedBy = User.Identity.Name
    };
    
    0 讨论(0)
  • 2021-02-07 01:10

    One option is that you can convert your properties into methods that return 'this'.

    Then you could write:

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

    I've heard this style called 'fluent interface', and find it pretty handy. I sometimes create properties and a matching set methods returning 'this' called SetXXXX to compliment them.

    The popular Rhino Mocks framework for unit testing uses it. More examples here: http://www.codeproject.com/Articles/99542/Guidelines-to-Fluent-Interface-design-in-C-Part-1

    0 讨论(0)
  • 2021-02-07 01:17

    If Question is a class (not a struct), then you could assign it to a local variable, and edit that:

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

    You won't even have to assign q back to itemView.Question.

    This is because classes in C# are reference types. If you assign an instance of a reference type to a local variable, or pass it to a function, then changes to that instance will be reflected everywhere you have a reference to that same instance.

    Edit

    Note that the situation might be a bit murky if Question is a property of itemView, rather than a field. Depending on how it is implemented, you might have to assign q back to Question. In such a case, this code is still much preferred to avoid calling the Question property's getter method repeatedly.

    0 讨论(0)
提交回复
热议问题