2012-11-16 50 views
2

我需要在类中创建一个属性,该属性将为程序员提供一个可供选择的值列表。我在过去使用枚举类型完成了此操作。如何动态创建“enum”类型属性值

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表值的类的初始值的列表。从我读过的内容来看,无法立即创建枚举,因为它们基本上是常量。

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

+2

如果你不知道编译时它们是什么,你会如何使用这些值?你只是想在编译之前自动生成代码? –

+0

这就是问题所在。我需要这些值来自一个表格,并以一种允许程序员从选择中进行选择的方式加载到类属性中。 –

+0

所以一旦代码被编译后,这些值是不会改变的? –

回答

-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 

然后,您可以添加应用程序,在您的项目预生成步骤,它自动每次运行编译主应用程序。

+0

这是一个生活在类库中的类。所以这段代码何时运行?每次课程更新或引用? –

+0

更新数据库后,您需要手动重新编译类库。 –

+0

您是否考虑更改数据的主要来源?如果源代码是数据的官方主要位置,那么当源代码发生变化时,数据库会自动更新,这可能会让我觉得更容易。或者更好的是,如果只需要在代码中拥有该列表,那么可以完全抛弃该数据库表。 –

1

我不知道这是否会回答你的问题,但它只是我的意见。我喜欢枚举,主要是因为它们对我来说很方便,程序员。这只是因为当我编写代码时,使用和枚举一个常量值不仅使我在输入时自动完成,而且编译时错误检查确保我只能提供有效的枚举值。但是,枚举不适用于运行时定义的值,因为像你说的那样,有编译时定义的常量。

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

现在,你可以做一点的混合,允许的值存储和来自表中,但定义常用的值作为代码常量,八九不离十是这样的:

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

这样您可以确保使用常见值进行编码时,一个点中的小字符串错字不会导致程序中的错误。另外,作为一个方面说明,我编写的代码和应用程​​序通过点击一次部署内部部署到我们公司,所以对于很少添加值,我仍然会使用枚举,因为它非常容易添加值并推出更新。因此,使用和枚举与数据库值的问题可以是获取用户更新的容易程度。如果你很少更新,数据库值可能是最好的,如果你经常更新和更新不是由用户完成的,那么枚举仍然可以工作。

希望有些帮助你!

+0

+1。根据我的经验,字符串按原样工作,即从长远来看,相应的常量只会使事情复杂化。 – Neolisk

+1

你说过,“编译时错误检查确保我只能提供有效的枚举值”,但事实并非如此,你可以随时将任何枚举类型的变量设置为任何整数值。 –

+0

@StevenDoggart,是的,你在技术上是正确的,最好的一种正确。我想更有可能编写'FileType =“Slase”',其中'FileType = FileType.Slase'甚至不会编译。 – Kratz