如何动态创建"enum"类型属性值



我需要在一个类中创建一个属性,该属性将为程序员提供一个可供选择的值列表。我过去曾使用enums类型来完成此操作。

Public Enum FileType
Sales
SalesOldType
End Enum
Public Property ServiceID() As enFileType
Get
Return m_enFileType
End Get
Set(ByVal value As enenFileType)
m_enFileType = value
End Set
End Property

问题是,我想基于SQL表值填充类的init上的值列表。根据我所读到的内容,不可能动态创建枚举,因为它们基本上是常量。

有没有一种方法可以实现我的目标,可能使用列表或字典类型?或任何其他可行的方法。

我不知道这是否能回答你的问题,但这只是我对此事的看法。我喜欢枚举,主要是因为它们对我这个程序员来说很方便。这只是因为当我写代码时,在常量值上使用和enum不仅可以在键入时自动完成,还可以进行编译时错误检查,确保我只能给出有效的enum值。然而,枚举不适用于运行时定义的值,因为正如您所说,存在编译时定义的常量。

通常,当我使用从SQL表加载的灵活值(如您的示例)时,我只使用字符串值。所以我只需要将SalesSalesOldType存储在表中,并将它们用于FileType的值。我通常使用字符串而不是整数,只是因为如果我在调试某些东西时查看数据表,字符串是可读的。

现在,您可以进行一点混合,允许存储值并从表中获取值,但将常用值定义为代码中的常量,排序如下:

Public Class FileTypeConstants
public const Sales = "Sales"
public const SalesOldType = "SalesOldType"
End Class

这样,您就可以确保在使用公共值进行编码时,一个位置的小字符串拼写错误不会导致程序出现错误。

此外,顺便说一句,我为和应用程序编写代码,这些代码通过点击一次部署在我们公司内部部署,所以对于很少添加的值,我仍然会使用枚举,因为添加值和推送更新非常容易。因此,使用和枚举与数据库值的问题可能是向用户获取更新的容易程度之一。如果您很少更新,数据库值可能是最好的;如果您经常更新,并且更新不是由用户完成的,那么枚举仍然可以正常工作。

希望其中的一些能帮助你!

如果代码编译后值不会改变,那么最好的选择就是简单地自动生成代码。例如,您可以编写一个简单的应用程序来执行以下操作:

Public Shared Sub Main()
Dim builder As New StringBuilder()
builder.AppendLine("' Auto-generated code.  Don't touch!!  Any changes will be automatically overwritten.")
builder.AppendLine("Public Enum FileType")
For Each pair As KeyValuePair(Of String, Integer) In GetFileTypesFromDb()
builder.AppendLine(String.Format("    {0} = {1}", pair.Key, pair.Value))
End For
builder.AppendLine("End Enum")
File.WriteAllText("FileTypes.vb", builder.ToString())
End Sub
Public Function GetFileTypesFromDb() As Dictionary(Of String, Integer)
'...
End Function

然后,您可以将该应用程序作为预构建步骤添加到项目中,以便在每次编译主应用程序时自动运行。