如何实现getter返回string、setter仅接受ResponseStatus枚举的C#属性
C# 语言规定同一个属性的 get 访问器返回值类型、set 访问器接收的 value 类型必须与属性本身的类型完全一致,因此无法直接在编译期实现「同一个属性 get 返回 string、set 仅接收 ResponseStatus 枚举」的强类型约束。以下提供两种符合需求的实现方案:
方案1:同属性名运行时校验实现
如果必须保留同一个属性名,满足取值直接返回字符串、赋值仅接受枚举的要求,可以将属性类型设为object,在set访问器中做类型校验:
private string _responseStatus; public object ResponseStatus { get { // 取值直接返回字符串 return _responseStatus; } set { // 校验传入值是否为ResponseStatus枚举类型 if (value is not ResponseStatus status) { throw new ArgumentException("仅支持传入ResponseStatus枚举类型赋值", nameof(value)); } _responseStatus = status.ToString(); } }
特点说明
- 完全匹配要求的同一属性名、取值拿字符串、赋值传枚举的逻辑
- 仅能在运行时校验类型,传入非法类型会触发运行时异常
- 取值时如需调用字符串方法,需要显式将返回值转换为
string类型
方案2:编译期强类型安全实现(推荐)
如果可以接受符合C#语法规范的设计,推荐拆分逻辑实现编译期类型校验,避免运行时异常:
// 枚举定义和原有一致 public enum ResponseStatus { Failed = 0, Success = 1, PartialSuccess = 2 } private ResponseStatus _responseStatus; // 用于赋值和获取枚举值,编译期自动校验类型 public ResponseStatus ResponseStatus { get => _responseStatus; set => _responseStatus = value; } // 快捷获取字符串形式的状态值 public string ResponseStatusText => _responseStatus.ToString();
特点说明
- 编译期即可校验赋值类型,不会出现运行时类型错误
- 枚举值和字符串值可以按需取用,无需额外转换
- 符合C#常规编码规范,可维护性更高
内容的提问来源于stack exchange,提问作者Aryan M
相关产品推荐
相关产品推荐

