2

我需要在一个类中创建一个属性,该属性将为程序员提供一个可供选择的值列表。我过去曾使用 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 值列表。根据我的阅读,不可能动态创建枚举,因为它们基本上是常量。

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

4

2 回答 2

1

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

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

现在,您可以做一些混合,允许存储值并来自表,但在代码中将常用值定义为常量,如下所示:

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

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

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

希望其中一些对您有所帮助!

于 2012-11-16T19:06:34.573 回答
-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

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

于 2012-11-19T13:46:05.020 回答