Я хочу передать объект методу, однако при этом я хочу изменить свойство указанного объекта. То, как я это делаю сейчас, выглядит так:
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.
Является ли это хорошей практикой, если это вообще возможно?
Нет, это не проблема, это решает проблему, но я хочу, чтобы код был в одну строку, а не в 3.
Я бы сказал, что вам действительно нужны 3 строки, так как сжатие до 1 строки затрудняет чтение и понимание.
Я думаю, что в этом случае будет легче понять 3 строки кода, а не одну строку. Почему вам нужна только одна строка кода?
Первый пример выглядит намного понятнее и понятнее, чем второй. Я бы остался с первым.
Хорошо, но можно ли сделать это в одну строку (например, есть ли синтаксис для достижения этой цели).
если вы проверите любой из стандартов кодирования, он предложит вам написать код, который легко поддерживать и легко понять вам и другим.
Почему? Удобочитаемость — это главное, а дополнительная строка вам ничего не стоит. Вы можете сделать это в одной строке, но, честно говоря, это только усложнит чтение кода. Большинство компаний помещают дополнительные методы, даже если они связаны, в отдельную строку для удобства чтения. Так что работать будет, но на мой взгляд не лучше
Нет - хорошая практика, если бы вы действительно хотели, чтобы это был общий стиль, сделал бы объект неизменяемым, и тогда беглый вызов, такой как ?.WithProperty1(2), имеет больше смысла. Как бы то ни было, с изменяемым объектом хорошо то, что вы можете ясно видеть, что объект изменяется, прежде чем он будет передан вызову.





Я не вижу причин делать это в одной строке. Этот код выглядит абсолютно нормально:
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"));
Но я чувствую, что это снижает читабельность кода.
Вы можете сделать это с помощью метода расширения, который изменяет свойство и возвращает измененный объект:
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))
Выполнение дополнительного шага действительно вызывает у вас проблемы..?