Могу ли я скопировать и добавить в новый производный экземпляр с помощью выражения "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" };