提问人:Ben 提问时间:11/16/2023 更新时间:11/16/2023 访问量:77
C 语言中的动态枚举#
Dynamic Enums in C#
问:
假设我有这个枚举:
public enum DynamicItem
{
FirstItem=1,
SecondItem=2
}
有没有办法使该枚举动态化,以便它的成员可以来自数据库查询,即如果我将 3/ThirdItem 添加到数据库表中,则该新项在枚举中可用,这将起作用:
public class Example
{
public DynamicItem item = DynamicItem.ThirdItem
}
答:
4赞
Peter
11/16/2023
#1
我确切地知道你为什么要这样做,所以经常有人在数据库和代码之间映射状态标志或类似的东西,但是不,没有办法这样做。
这样做也没有意义 - 通常我们针对枚举值进行编码 - 您会在这里针对什么进行编码?如果可以的话,如果它们在运行时因为从数据库中删除而消失,你会得到运行时失败,这将与 C# 的静态类型背道而驰。
0赞
JonasH
11/16/2023
#2
在某些情况下,使用类型包装整数可能很有用,例如
public readonly record struct DynamicItem(int Id)
{
public static DynamicItem FirstItem { get; } = new(1);
public static DynamicItem SecondItem { get; } = new(2);
....
}
这允许您使用友好名称在代码中引用特定值,同时对未知值使用某些默认行为。
您需要考虑向后和向前兼容性。您不能再假设列出的值是唯一存在的值,您确实需要确保特定值不用于表示不同版本中的不同内容。
Ofc,您的代码无法处理它不知道的项目。因此,如果将来添加值,它们都将获得相同的默认行为。除非您向数据库添加其他信息来描述它们应具有的行为。也就是说,你的“枚举”实际上只是一个类,可能是一个多态类。
评论
(DynamicItem)0