如何强制继承的C# Record通过属性初始化器初始化属性?
C# Record 强制派生类通过属性初始化器初始化属性的方案
你需要让抽象Record的派生类必须在内部通过属性初始化器完成heading属性的初始化,而非依赖构造函数或外部对象初始化器。可以通过以下方式实现:
核心思路
将抽象Record中的heading定义为抽象只读属性,利用C#的明确赋值检查机制,强制派生类必须在属性初始化器中为其赋值——因为只读属性只能在类内部的属性初始化器或构造函数中赋值,若不自定义构造函数,就只能通过属性初始化器完成初始化。
代码实现
抽象Record定义
internal abstract record TaskManagerLocalization { // 抽象只读属性,强制派生类实现并赋值 internal abstract string Heading { get; } }
符合要求的派生Record
internal record TaskManagerJapaneseLocalization : TaskManagerLocalization { // 必须通过属性初始化器赋值,否则编译报错 internal override string Heading { get; } = "タスクマネージャー"; }
错误示例(编译不通过)
如果派生类省略属性初始化器,C#编译器会抛出明确赋值错误:
internal record TaskManagerJapaneseLocalization : TaskManagerLocalization { // 编译错误:非静态字段、方法或属性 'TaskManagerJapaneseLocalization.Heading' 必须包含明确赋值 internal override string Heading { get; }; }
说明
- 这里使用只读属性(
get;)而非init;,是为了避免派生类的实例被外部通过对象初始化器修改Heading值,确保属性值只能在类内部初始化时确定。 - 若你需要保留
init的可初始化特性但仍强制内部初始化,可以将派生类的构造函数设为私有并通过工厂方法创建实例,但上述方案更直接满足你的核心需求。
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

