Могу ли я скопировать и добавить в новый производный экземпляр с помощью выражения "with" записи C# 9?

Предположим, у меня есть следующее:

public record Settings 
{
  public int Setting1 { get; init; }
}

public record MoreSettings : Settings
{
  public string Setting2 { get; init; }
}
...

var settings = new Settings { Setting1 = 1 };

// This is an error - CS0117
MoreSettings moreSettings = settings with { Setting2 = "A string setting" };

Есть ли чистый способ добиться этого? У меня неправильный синтаксис?
Очевидно, что в этом надуманном случае я мог просто вручную скопировать каждое базовое свойство.

var moreSettings = new MoreSettings { Setting1 = settings.Setting1, Setting2 = "A String!" };

Но что, если у базового типа записи много свойств?

1 ответ

Решение

Из вашего исходного вопроса,

MoreSettings moreSettings = settings with { Setting2 = "A string setting" };

withключевое слово внутренне обеспечивает вызов конструктора копирования типа перед изменением указанных свойств. В Settings В этом примере record не имеет свойства с именем Settings2, поэтому это запрещено.

Что касается вашего второго подхода, если базовый класс имеет много свойств участка, вы можете ввести дополнительный конструктор для MoreSettings запись, которая принимает экземпляр Settingsв качестве обходного пути, чтобы не добавлять каждое из свойств, как во втором примере, приведенном в OP.

Вместо этого вы могли бы,

public record MoreSettings : Settings
{
   public MoreSettings(Settings parent) : base(parent) { }
   public string Setting2 { get; init; }
}

Теперь вы можете позвонить, позвонить как

MoreSettings moreSettings = new MoreSettings(settings) { Setting2 = "A string setting" };

Вы также можете удалить MoreSettings с правой стороны, используя выражения Target-Type New в C# 9.

MoreSettings moreSettings = new (settings)  { Setting2 = "A string setting" };
Другие вопросы по тегам