У меня есть неизменный объект. Например, простой пример ниже.Как сопоставить свойства объекта с аргументами конструктора в C# для построения автоматической копии
class Person {
public string Name {get;}
public int Age {get;}
public Person(string name, int age){
Name = name;
Age = age;
}
}
Теперь я хотел бы иметь общий метод расширения, такие как
public static class ObjectExtensions {
public void T With<T,P>(this T target, Expression<Func<T,P>> selector, P value){
/* some implementatation */
}
}
Так что я могу сделать
var person = new Person("brad", 12).With(p=>p.Age,55);
person.Age.Should().Be(55);
При использовании метода следует использовать отражение для сопоставления имен аргумента конструктора с свойства существующего объекта.
- Производительность не является проблемой.
- Ошибка выполнения в порядке, если имена аргументов конструктора не соответствуют именам свойств. (Анализатор roslyn мог решить эту проблему)
- Использование отражения для установки свойств с использованием частных сеттеров после мелкого клонирования также нежелательно. (У меня есть решение в настоящее время, которое делает это)
Цель состоит в том, чтобы дополнительные классы не добавлялись к неизменяемому классу, кроме конструктора, с аргументами с именами, которые соответствуют свойствам.
Явный При использовании метода с обнуляемым аргументы, такие как
class Person {
public string Name {get;}
public int Age {get;}
public Person(string name, int age){
Name = name;
Age = age;
}
public Person With(string? name, int? age){
return new Person(name ?? this.Name, age ?? this.Age);
}
}
хотя элегантный не решение, которое я ищу для моего случая использования.
В этом scenerio вы передаете 'p.Age', но конструктор arg для' Age ''не существует. Вы предполагаете, что имена аргументов contructor соответствуют именам свойств, которые относятся к делу, является ли это безопасным предположением. –
Да, не считая случая, он безопасен. – bradgonesurfing