I have code that looks like this:
itemView.Question.AnswersJSON = itemView.Answer.ToJSONString();
itemView.Question.Modified = DateTime.Now;
itemView.Question.Mo
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
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);
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
};
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
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.