我需要在一个类中创建一个属性,该属性将为程序员提供一个可供选择的值列表。我过去使用枚举类型做过这个。
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上的值列表。根据我的阅读,不可能动态创建枚举,因为它们基本上是常量。
有没有办法可以使用列表或字典类型来实现我的目标? 或任何其他可行的方法。
答案 0 :(得分:1)
我不知道这是否会回答你的问题,但这只是我对此事的看法。我喜欢enums,主要是因为它们对我很方便,程序员。这只是因为当我编写代码时,使用和枚举常量值不仅使我不仅在键入时自动完成,而且还使编译时错误检查确保我只能给出有效的枚举值。但是,枚举只是不适用于运行时定义的值,因为,就像你说的那样,有编译时定义的常量。
通常,当我使用从示例中加载SQL表的灵活值时,我只会使用字符串值。因此,我只需将Sales
和SalesOldType
存储在表格中,并将其用作FileType
的值。我通常使用字符串而不是整数,因为如果我在调试时查看数据表,字符串是人类可读的。
现在,您可以执行一些混合操作,允许存储值并来自表,但是将常用值定义为代码中的常量,如下所示:
Public Class FileTypeConstants
public const Sales = "Sales"
public const SalesOldType = "SalesOldType"
End Class
通过这种方式,您可以确保在使用常见值进行编码时,一个字母中的小字符串错误不会导致程序中出现错误。
另外,作为附注,我编写代码和应用程序,通过一次性部署部署内部部署到我们公司,因此对于很少添加的值,我仍然会使用枚举,因为它非常容易添加值和推出更新。因此,使用和枚举与数据库值的问题可能是获取用户更新的难易程度之一。如果你很少更新,数据库值可能是最好的,如果你经常更新并且用户没有完成更新,那么枚举仍然可以正常工作。
希望其中一些可以帮到你!
答案 1 :(得分:-1)
如果在编译代码后值不会改变,那么听起来最好的选择就是自动生成代码。例如,您可以编写一个类似这样的简单应用程序:
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
然后,您可以将该应用程序添加为项目中的预构建步骤,以便每次编译主应用程序时它都会自动运行。