C 语言中的动态枚举#

Dynamic Enums in C#

提问人:Ben 提问时间:11/16/2023 更新时间:11/16/2023 访问量:77

问:

假设我有这个枚举:

public enum DynamicItem
{
FirstItem=1,
SecondItem=2
}

有没有办法使该枚举动态化,以便它的成员可以来自数据库查询,即如果我将 3/ThirdItem 添加到数据库表中,则该新项在枚举中可用,这将起作用:

public class Example
{
public DynamicItem item = DynamicItem.ThirdItem
}
C# .net

评论

9赞 Ralf 11/16/2023
如果你想让它动态化,它不应该再是一个枚举。枚举可帮助您编写易于理解的代码,因为您可以针对命名值进行编码。所以这是一个编译时的事情。如果你只知道在运行时,那么它似乎根本没有帮助。说你可以将支持类型的任何值转换为一个枚举值,你就可以做到。你只是没有值的名称。(DynamicItem)0
0赞 Charlieface 11/16/2023
也许你应该让一个 T4 模板从数据库中加载枚举。或者使用EF电动工具之类的东西。
0赞 Andrew Morton 11/16/2023
如果你想将数字映射到字符串,也许字典会很好用。

答:

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,您的代码无法处理它不知道的项目。因此,如果将来添加值,它们都将获得相同的默认行为。除非您向数据库添加其他信息来描述它们应具有的行为。也就是说,你的“枚举”实际上只是一个类,可能是一个多态类