如何根据自身值及其他字段值设置C# Enum字段?
正确实现Enum字段的自动赋值逻辑
你的代码存在三个核心问题:
- 非可空Enum无法使用
??运算符:Enum是值类型,默认不能为null,Bar ?? ...会直接编译报错,必须用可空Enum(TypeEnum?)来表示“未设置”状态。 - set访问器无限递归:在set中直接给
Bar赋值会反复触发set访问器,最终导致栈溢出,必须通过私有字段存储实际值。 - 缺少get访问器:C#属性必须至少包含get或set访问器,否则无法通过编译。
根据你的需求(字段不为null时保留原值,否则根据Foo的值自动设置),以下是两种常见的正确实现方式:
方式一:访问字段时自动生成默认值
如果需求是:当Bar未被主动设置过时,访问它时自动根据Foo的值返回对应Enum;如果已经设置过,则返回已设置的值。
// 先定义你的Enum public enum TypeEnum { Type1, Type2 } public class Test { public bool Foo { get; set; } = false; // 用可空私有字段存储实际值,默认null表示未设置 private TypeEnum? _bar; public TypeEnum Bar { get { // 如果未设置过_bar,根据Foo生成值;否则返回已设置的值 return _bar ?? (Foo ? TypeEnum.Type1 : TypeEnum.Type2); } set { // 直接给私有字段赋值,避免递归 _bar = value; } } }
方式二:设置字段时处理空值
如果需求是:当给Bar赋值时,如果传入的是null,则根据Foo自动设置Enum值;如果传入非空值,则直接使用传入的值。
public enum TypeEnum { Type1, Type2 } public class Test { public bool Foo { get; set; } = false; private TypeEnum _bar; // 属性定义为可空,允许传入null进行赋值 public TypeEnum? Bar { get => _bar; set { // 如果传入的value是null,根据Foo生成值;否则使用传入的value _bar = value ?? (Foo ? TypeEnum.Type1 : TypeEnum.Type2); } } }
关键说明
- 使用可空Enum(
TypeEnum?)是实现“未设置”状态的核心,普通Enum作为值类型无法为null。 - 所有对属性值的操作都通过私有字段完成,避免了属性访问器的递归调用问题。
- 两种方式可根据实际业务需求选择:如果希望字段始终返回非空值,优先选方式一;如果需要明确区分“已设置”和“未设置”状态,可选用方式二。
内容的提问来源于stack exchange,提问作者Neyoh
相关产品推荐
相关产品推荐

