TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.76K subscribers
Post #1464 1.96K
День 1187. #ЗаметкиНаПолях
Апкаст Записей
Интересную особенность записей обнаружил Фил Хаак. Вы не можете сделать апкаст, как для класса. Допустим, у нас есть следующие записи.
Базовая (она же DTO для обновления):
public record PersonUpdate()
{
public string Name {get; init;}
//... остальные свойства
};

Производная (с добавленным свойством Id):
public record Person(int Id)
: PersonUpdate() {};

Задача стандартная: получить Person из базы или API, создать PersonUpdate с изменёнными свойствами и отправить его в метод UpdatePerson. Код получается довольно простой:
var person = GetPerson(42);

var updated = (PersonUpdate)person
with { Name = "New Name", …};

UpdatePerson(42, updated);

Вроде всё должно работать. Но давайте посмотрим, что у нас получилось в updated:
Console.WriteLine(updated);
// Вывод:
// Person { Name = New Name, Id = 42 }

Свойство обновилось, но тип всё равно производный и содержит Id. Это, конечно, может не быть проблемой, но для Фила стало, т.к. API для обновления принимал объект без свойства Id, а в этом случае выдавал ошибку.

Фил спросил сообщество, как решить эту проблему. Предлагались разные варианты от использования маппера до сериализации/десериализации. Но решение нашлось довольно элегантное.
public record PersonUpdate()
{
//... свойства

public static PersonUpdate
Copy(PersonUpdate updated) => new(updated);
};

Статический метод принимает запись и выдаёт её копию. И действительно:
var updated = PersonUpdate.Copy(person) 
with { Name = "New Name"};

Console.WriteLine(updated);
// Вывод:
// PersonUpdate { Name = New Name }

Источник: https://gist.github.com/haacked/b47ed096201a47c9ebceb7397c09d28b
  • 👍 16
More from @netdeveloperdiary
  1. Oct 14, 2026Post #3373
  2. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  3. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  4. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  6. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →