假设我有这个枚举:
public enum DynamicItem { FirstItem=1, SecondItem=2 }
字符串有没有什么方法可以使枚举动态化,这样它的成员就可以来自数据库查询,也就是说,如果我将3/ThirdItem添加到数据库表中,那么枚举中的新项就可以使用了,这将起作用:
public class Example { public DynamicItem item = DynamicItem.ThirdItem }
型
n6lpvg4x1#
我很清楚你为什么要这样做,通常情况下,一个是在数据库和代码之间Map状态标志或类似的东西,但是没有办法做到这一点。这样做也没什么意义--通常我们针对枚举值编码--你会针对什么编码呢?如果可以的话,如果它们在运行时消失了,因为它们从数据库中被删除了,你会得到运行时失败,这将违背C#的静态类型。
igsr9ssn2#
在某些情况下,使用类型 Package 整数可能很有用,例如
public readonly record struct DynamicItem(int Id) { public static DynamicItem FirstItem { get; } = new(1); public static DynamicItem SecondItem { get; } = new(2); .... }
字符串这允许您使用友好的名称引用代码中的特定值,同时对未知值使用某些默认行为。您需要考虑向后和向前兼容性。您不能再假设列出的值是唯一存在的值,并且您确实需要确保特定值不会用于表示不同版本中的不同内容。Ofc,你的代码不能处理它不知道的项目。所以如果将来添加值,它们都将获得相同的默认行为。除非你向数据库添加额外的信息来描述它们应该具有的行为。即,你的"枚举"实际上只是一个类,possibly a polymorphic class。
2条答案
按热度按时间n6lpvg4x1#
我很清楚你为什么要这样做,通常情况下,一个是在数据库和代码之间Map状态标志或类似的东西,但是没有办法做到这一点。
这样做也没什么意义--通常我们针对枚举值编码--你会针对什么编码呢?如果可以的话,如果它们在运行时消失了,因为它们从数据库中被删除了,你会得到运行时失败,这将违背C#的静态类型。
igsr9ssn2#
在某些情况下,使用类型 Package 整数可能很有用,例如
字符串
这允许您使用友好的名称引用代码中的特定值,同时对未知值使用某些默认行为。
您需要考虑向后和向前兼容性。您不能再假设列出的值是唯一存在的值,并且您确实需要确保特定值不会用于表示不同版本中的不同内容。
Ofc,你的代码不能处理它不知道的项目。所以如果将来添加值,它们都将获得相同的默认行为。除非你向数据库添加额外的信息来描述它们应该具有的行为。即,你的"枚举"实际上只是一个类,possibly a polymorphic class。