我可以使用 C# 9 记录 "with" 表达式复制并添加到新的派生实例吗?
Using C# 9 records "with" expression can I copy and add to new derived instance?
假设我有以下内容:
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!" };
但是如果基本记录类型有很多属性呢?
根据你原来的问题,
MoreSettings moreSettings = settings with { Setting2 = "A string setting" };
with
关键字在内部确保在更改指定属性之前调用该类型的复制构造函数。在示例中,Settings
记录没有名为 Settings2 的 属性,这就是不允许这样做的原因。
关于你的第二种方法,如果基础 class 有很多属性,你可以为 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" };
您还可以通过使用 Target-Type C# 9 中的新表达式
删除右侧的 MoreSettings
MoreSettings moreSettings = new (settings) { Setting2 = "A string setting" };
假设我有以下内容:
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!" };
但是如果基本记录类型有很多属性呢?
根据你原来的问题,
MoreSettings moreSettings = settings with { Setting2 = "A string setting" };
with
关键字在内部确保在更改指定属性之前调用该类型的复制构造函数。在示例中,Settings
记录没有名为 Settings2 的 属性,这就是不允许这样做的原因。
关于你的第二种方法,如果基础 class 有很多属性,你可以为 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" };
您还可以通过使用 Target-Type C# 9 中的新表达式
删除右侧的 MoreSettingsMoreSettings moreSettings = new (settings) { Setting2 = "A string setting" };