Как изменить свойство объекта, переданное в качестве параметра?

#c# #.net #oop #parameters

#c# #.net #ооп #параметры

Вопрос:

Я хочу передать объект методу, однако во время этого я хочу изменить свойство указанного объекта. Сейчас я делаю это так:

 MyClass someClass= someClasses.FirstOrDefault(s => s.Propert1. == "1");
someClass.Property1 = 2;
MyMethod(someClass);
  

Однако я не хочу делать дополнительный шаг по созданию переменной и последующей настройке свойства.

 MyMethod(someClasses.FirstOrDefault(s => s.Propert1. == "1")/*.ChangeProperty()?*/); //This is where I would like to change Property1's value.
  

Является ли это хорошей практикой, если это вообще возможно?

Комментарии:

1. Действительно ли выполнение дополнительного шага вызывает у вас проблему ..?

2. Я бы сказал, что вам действительно нужны 3 строки, поскольку сжатие их до 1 строки затрудняет чтение и понимание.

3. Я думаю, что в этом случае будет легче понять 3 строки кода, а не одну строку. Почему вам нужна только одна строка кода?

4. Первый пример выглядит гораздо более понятным и понятным, чем второй. Я бы остался с первым.

5. если вы проверите какую-либо практику стандартов кодирования, вам будет предложено написать код, который прост в обслуживании и понятен вам и другим

Ответ №1:

Я не вижу никаких причин делать это в одной строке. Этот код выглядит абсолютно нормально:

 MyClass someClass= someClasses.FirstOrDefault(s => s.Propert1. == "1");
someClass.Property1 = 2;
MyMethod(someClass);
  

Если вы хотите, вы можете добавить метод расширения, который делает это:

 // put this in a static class
static T WithNewPropertyValue<T>(this T t, Action<T> action) where T : class
{
    action(t);
    return t;
}
  

И назовите это так

 MyMethod(someClasses.FirstOrDefault(s => s.Propert1 == "1").WithNewPropertyValue(x => x.Propert1 = "2"));
  

Но я чувствую, что это снижает читаемость кода.

Ответ №2:

Вы можете сделать это с помощью метода расширения, который изменяет свойство и возвращает измененный объект:

 public static MyClass WithProperty2(this MyClass source, int value)
{
   if (source != null)  // make sure you handle null
     source.Property2 = value;

   return source;
}
  

Теперь у вас есть свободный API для создания однострочников (что не делает ваш код намного более удобным в обслуживании):

 MyMethod(someClasses.FirstOrDefault(s => s.Propert1. == "1").WithProperty2(42))