【问题标题】:vb.net: override toString method for enumsvb.net:覆盖枚举的 toString 方法
【发布时间】:2016-02-24 11:09:01
【问题描述】:

我想为每个枚举值覆盖 toString 方法。例如,我知道在 Java 中可以这样做:

public enum Language_Culture_Names{

  English {
    @Override
    public String toString() {
      return "en-GB";
    }
  },
  Spanish {
    @Override
    public String toString() {
      return "es-ES";
    }
  },
  Catalan {
    @Override
    public String toString() {
      return "ca-ES";
    }
  }

}

  System.out.println(Language_Culture_Names.English); -> returns en-GB
  System.out.println(Language_Culture_Names.Spanish); -> returns es-ES
  System.out.println(Language_Culture_Names.Catalan); -> returns ca-ES

那么如何在 VB.NET 中做到这一点?

【问题讨论】:

  • 不是添加“解决方案”部分,而是将其添加为答案。回答你自己的问题是最有效的。我的建议是回滚您的最新编辑并将该部分添加为答案。
  • @Default 我同意。完毕。谢谢!

标签: vb.net enums tostring enumeration


【解决方案1】:

理想情况下,您应该使用为自己定制的Class,因为Enums 是数字常量而不是字符串常量。

但是,如果您必须使用 Enum 并且正在寻找通用解决方案,我会这样做:

首先,在您的项目中添加Module,代码如下:

Imports System.ComponentModel
Imports System.Runtime.CompilerServices

Module Module1
    <Extension()> _
    Public Function ToString2(ByVal EnumConstant As [Enum]) As String
        Dim fi As Reflection.FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString())
        Dim aattr() As DescriptionAttribute = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())
        If aattr.Length > 0 Then
            Return aattr(0).Description
        Else
            Return EnumConstant.ToString()
        End If
    End Function

End Module

我们将函数命名为ToString2,因为Enum.ToString 已经存在,并且不能被覆盖。您可以将其命名为其他任何名称。

现在在您声明了Enum 的类中,用Description 属性装饰枚举成员:

Imports System.ComponentModel  '<-- be sure to include this Namespace

Public Enum Language_Culture_Names
    <Description("en-GB")> English = 1
    <Description("es-ES")> Spanish = 2
    <Description("ca-ES")> Catalan = 3
End Enum

最后转储Enum.ToString 方法并改用我们的新Enum.ToString2 方法。

例如

TextBox1.Text = Language_Culture_Names.English.ToString2()

HTH。

【讨论】:

    【解决方案2】:

    最后我使用了 type-safe-enum Pattern,如下所示:

    Public NotInheritable Class LanguageCultureNames
    
        Private ReadOnly name As String
        Private ReadOnly value As Integer
    
        Public Shared ReadOnly English As New LanguageCultureNames(0, "en-GB")
        Public Shared ReadOnly Spanish As New LanguageCultureNames(1, "es-ES")
        Public Shared ReadOnly Catalan As New LanguageCultureNames(2, "ca-ES")
    
        Private Sub New(ByVal value As Integer, ByVal name As String)
            Me.name = name
            Me.value = value
        End Sub
    
        Public Overrides Function ToString() As String
            Return name
        End Function
    
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2012-03-28
      • 2021-07-18
      • 2011-08-31
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多