指向一个枚举或另一个枚举的变量?

时间:2017-04-13 10:10:29

标签: vb.net enums

我有一个.NET项目,其中上传Excel并逐行转换为对象。这很好。

我已经定义了一个枚举,用于在Excel文件中的列和列的索引之间创建映射,我需要从列中获取值

如此:

 Public Enum ColumnIndexEnum
       FirstName = 1
       LastName = 2
       Address = 3
       ...
 End Enum

这是这样使用的:(伪代码)

   Dim row = 1
   WorkSheet.GetValue(ColumnIndexEnum.FirstName, row)

我过去曾使用枚举来输入新列。我可以通过输入新条目来编辑Enum,而不必更改任何读取特定列的代码

现在我必须进行一些更改,其中某些列在某些情况下会消失,但在其他情况下会返回。换句话说:有时列FirstName将是第一列(索引1),有时候,它将是第二列。

我不知道如何最好地接近这一点。我正在考虑创建第二个枚举并切换我使用的枚举,但无法找到有关如何创建指向一个枚举或另一个枚举的变量的任何细节。

有没有人对此有任何想法?我在这个项目中使用VB.NET

4 个答案:

答案 0 :(得分:1)

你不能拥有“指向一个枚举或另一个枚举的变量”。首先,因为它是一种打字语言,其次是因为它不是一种引用类型(可以指向它)。您可以通过将枚举转换为整数(或枚举的支持类型)来存储列索引。在一天结束的时候,所有的枚举都是为你做的,给你一些数字值的别名,而cast可以让你得到那个潜在价值。

答案 1 :(得分:1)

这是一个结构性问题,因为您只使用枚举来为您的整数值指定可读名称。

让我们说现有的excel格式就像你说的那样:

Public Enum ColumnIndexEnum
   FirstName = 1
   LastName = 2
   Address = 3
   ...
End Enum

现在你有了另一种excel格式,其中firstname是第2列,Title是第1列,如:

Public Enum ColumnIndexEnum2
   Title = 1
   FirstName = 2
   LastName = 3
   Address = 4
   ...
End Enum

所以是的,您可以根据需要创建新的枚举并使用它们。但是,我个人自己使用了EPPlus或CSVReader nuget包,因为我不必依赖特定的列顺序,我可以读取给定列名称的值。如果你没有列名,那就是另一个故事。

答案 2 :(得分:1)

你可以在这样的辅助函数中执行此操作:

Public Enum ColumnIndexEnum
   FirstName = 1
   LastName = 2
   Address = 3
   ...
 End Enum

Public Enum ColumnType
   FirstType = 1
   SecondType = 2
   ...
 End Enum

Public Function GetColumn(ByVal col As ColumnIndexEnum, ByVal colType As ColumnType) As Integer
    Select Case col
        Case ColumnIndexEnum.FirstName
            If colType = ColumnType.FirstType Then
                Return 1
            ElseIf colType = ColumnType.SecondType Then
                Return 2
            End If
        Case ColumnIndexEnum.SecondName
            If colType = ColumnType.FirstType Then
                Return 2
            ElseIf colType = ColumnType.SecondType Then
                Return 3
            End If
        ...
    End Select
End Function

然后你可以这样使用它:

Dim row = 1
WorkSheet.GetValue(GetColumn(ColumnIndexEnum.FirstName,ColumnType.FirstType), row)

答案 3 :(得分:0)

从这里开始

Public Enum ColumnIndexEnum
    FirstName = 1
    LastName = 2
    Address = 3
End Enum

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim row = 1
    WorkSheet.GetValue(ColumnIndexEnum.FirstName, row)
End Sub

Step1-更改枚举的名称。 (使用红色下划线更改所有名称)

Public Enum ColumnIndexGetter
    FirstName = 1
    LastName = 2
    Address = 3
End Enum

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim row = 1
    WorkSheet.GetValue(ColumnIndexGetter.FirstName, row)
End Sub

Step2 - 摆脱枚举

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim row = 1
    WorkSheet.GetValue(ColumnIndexGetter.FirstName, row)
End Sub

Step3 - 定义新变量

Private ColumnIndexGetter As Cases

和案例类。你需要修改它以适应实际情况,希望你能得到这个想法。

Public Class Cases
    Private Enum ColumnIndexCase1
        FirstName = 1
        LastName = 2
        Address = 3
    End Enum

    Private Enum ColumnIndexCase2
        FirstName = 2
        LastName = 3
        Address = 7
    End Enum

    Private _whCase As Integer
    Public Sub New(WhichCase As Integer)
        Me._whCase = WhichCase
    End Sub

    Public Function FirstName() As Integer
        Dim rv As Integer = 0
        Select Case Me._whCase
            Case 1
                rv = ColumnIndexCase1.FirstName

            Case 2
                rv = ColumnIndexCase2.FirstName

        End Select
        Return rv
    End Function

    Public Function LastName() As Integer
        Dim rv As Integer = 0
        Select Case Me._whCase
            Case 1
                rv = ColumnIndexCase1.LastName

            Case 2
                rv = ColumnIndexCase2.LastName

        End Select
        Return rv
    End Function

    Public Function Address() As Integer
        Dim rv As Integer = 0
        Select Case Me._whCase
            Case 1
                rv = ColumnIndexCase1.Address

            Case 2
                rv = ColumnIndexCase2.Address

        End Select
        Return rv
    End Function
End Class

最后,在使用ColumnIndexGetter之前,您需要

    ColumnIndexGetter = New Cases(1)
    'or
    ColumnIndexGetter = New Cases(2)

然后代码看起来像

Private ColumnIndexGetter As Cases
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ColumnIndexGetter = New Cases(1)
    'or
    ColumnIndexGetter = New Cases(2)

    Dim row = 1
    WorkSheet.GetValue(ColumnIndexGetter.FirstName, row)
End Sub

ColumnIndexGetter初始化的实际位置可能就是您知道要处理的是哪种情况。