C#运行时通过基类实例将int转换为派生类指定Enum类型
问题背景
现有一组均继承自同一基类BaseClass的类,每个派生类都定义了名称相同的独立嵌套枚举类型,定义代码如下:
public class DerivedClassOne : BaseClass { public enum Flags { None = 0, cheese = 1, ham = 2, egg = 4 } } public class DerivedClassTwo : BaseClass { public enum Flags { None = 0, bacon = 1, lettuce = 2, tomato = 4 } }
需求为:仅持有BaseClass类型实例的情况下,在运行时将整型值n转换为对应派生类下的枚举类型并存储,期望实现效果如下:
object flag = (BaseClassInstance.Enums.Flags)n;
实现方法
由于Flags枚举是定义在各个派生类内部的嵌套类型,基类层面不存在该类型定义,需要通过反射在运行时获取实例真实类型对应的枚举,再完成值转换,具体步骤如下:
- 调用实例的
GetType()方法,获取当前BaseClass引用指向的真实派生类类型 - 从派生类类型中检索名为
Flags的公共嵌套枚举类型 - 调用
Enum.ToObject()方法,将传入的整型值转换为对应枚举类型的实例
可直接复用的通用实现代码:
using System; using System.Reflection; public static object ConvertToMatchingFlags(BaseClass instance, int n) { Type realType = instance.GetType(); Type flagsType = realType.GetNestedType("Flags", BindingFlags.Public); if (flagsType == null || !flagsType.IsEnum) { throw new InvalidOperationException($"类型{realType.Name}未定义符合要求的公共Flags枚举"); } // 可选:校验整型值是否在枚举定义范围内,位标记枚举可去掉该判断支持组合值 if (!Enum.IsDefined(flagsType, n)) { throw new ArgumentOutOfRangeException(nameof(n), "传入值不在对应Flags枚举的定义范围内"); } return Enum.ToObject(flagsType, n); }
调用示例:
BaseClass ins = new DerivedClassTwo(); object flag = ConvertToMatchingFlags(ins, 2); // 得到的结果等价于 DerivedClassTwo.Flags.lettuce
- 注意:使用反射相关API需要提前引入
System.Reflection命名空间。如果枚举标记了[Flags]特性需要支持多值位组合,直接删除Enum.IsDefined校验逻辑即可。
内容的提问来源于stack exchange,提问作者leahshmovie
相关产品推荐
相关产品推荐

