Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 我如何才能创建一个;“枚举”;动态键入属性值_Vb.net_List_Properties_Dictionary_Enums - Fatal编程技术网

Vb.net 我如何才能创建一个;“枚举”;动态键入属性值

Vb.net 我如何才能创建一个;“枚举”;动态键入属性值,vb.net,list,properties,dictionary,enums,Vb.net,List,Properties,Dictionary,Enums,我需要在一个类中创建一个属性,该属性将为程序员提供一个可供选择的值列表。我以前使用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_e

我需要在一个类中创建一个属性,该属性将为程序员提供一个可供选择的值列表。我以前使用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上的值列表。从我所读到的内容来看,不可能动态创建枚举,因为它们基本上是常量

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

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

通常,当我使用从SQL表加载的灵活值(如您的示例中所示)时,我只使用字符串值。因此,我只需将
Sales
SalesOldType
存储在表中,并将它们用于
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
这样,您就可以确保在使用公共值编码时,一个点上的一个小字符串输入错误不会在您的程序中引起错误

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


希望这对你有所帮助

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

 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

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

如果您不知道这些值在编译时是什么,您将如何使用它们?您只是希望在编译之前自动生成代码吗?这就是问题所在。我需要这些值来自一个表,并以允许程序员从选择中选择的方式加载到class属性中。因此,一旦编译代码,这些值不会改变?正确,其思想是,当一个新项目被添加到表中时,开发人员使用它的选项将被更新,而无需更改此类中的代码。+1。根据我的经验,字符串按原样工作,即从长远来看,生成相应的常量只会使事情变得复杂。你说过,“编译时错误检查确保我只能给出有效的枚举值”,但那不是真的,你可以将任何枚举类型的变量设置为任何整数值。@Stevendogart,是的,你在技术上是正确的,最好的一种是正确的。我想写
FileType=“Slase”
更可能,其中
FileType=FileType。Slase甚至不会编译。这是针对生活在类库中的类。那么这段代码什么时候运行?每次更新或引用类时?更新数据库后,您需要手动重新编译类库。您是否考虑过更改数据的主要源?如果源代码是数据的官方主要位置,那么只需在源代码更改时保持数据库自动更新,我认为这可能更容易。或者更好的是,如果只需要在代码中包含该列表,您可以完全放弃该数据库表。在这里无法更改数据存储位置。数据实际上是从另一个应用程序创建的。我希望我可以编写代码,根据从其他应用程序收集的数据生成这个类。你的解决方案是我找到的最接近我想要的。