VB.NET:为枚举类型重写ToString方法

5
我希望为每个枚举值覆盖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中实现呢?

1
不要添加“解决方案”部分,将其作为答案添加。自己回答自己的问题是最有效的方式。我的建议是回滚您的最新编辑,将该部分作为答案添加。 - default
@默认 我同意。完成。谢谢! - Willy
2个回答

3

理想情况下,您应该使用定制化的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.


1

最后,我使用了以下类型安全枚举模式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接