如何自动用C#枚举值初始化只读HashSet?
没问题,这事儿很好解决——你完全可以借助Enum.GetValues来实现自动填充,不用再手动维护枚举值列表!
核心解决方案
因为Enum.GetValues返回的是Array类型,咱们只需要做一步强类型转换,就能直接喂给HashSet的构造函数,完美适配你的只读字段初始化要求:
// 基础版:只读字段,自动同步枚举所有值 private readonly HashSet<MyColors> _allColors = new HashSet<MyColors>(Enum.GetValues(typeof(MyColors)).Cast<MyColors>());
如果还想让这个集合外部完全无法修改(比如防止不小心调用Add/Remove),可以把它包装成只读集合类型:
// 进阶版:外部无法修改的只读集合 private readonly IReadOnlySet<MyColors> _allColors = new HashSet<MyColors>(Enum.GetValues(typeof(MyColors)).Cast<MyColors>());
或者用HashSet自带的AsReadOnly()方法生成只读包装:
private readonly IReadOnlySet<MyColors> _allColors = new HashSet<MyColors>(Enum.GetValues(typeof(MyColors)).Cast<MyColors>()).AsReadOnly();
更简洁的写法(C# 7.3+)
如果你用的是C# 7.3及以上版本,还可以用泛型版的Enum.GetValues<T>(),代码更清爽,不需要额外的Cast操作:
private readonly HashSet<MyColors> _allColors = new HashSet<MyColors>(Enum.GetValues<MyColors>());
原理说明
Enum.GetValues(typeof(MyColors))会返回该枚举所有有效值的数组,通过Cast<MyColors>()(或者泛型版本直接返回)把非泛型数组转换成强类型的IEnumerable<MyColors>,完全符合HashSet构造函数的参数要求。- 因为是在字段初始化阶段完成的赋值,完全满足你“只读字段必须在定义时初始化”的要求。后续你给
MyColors新增枚举值,编译后这个HashSet会自动包含新值,再也不用手动同步啦!
内容的提问来源于stack exchange,提问作者lilotop
相关产品推荐
相关产品推荐

