vb.net:覆盖枚举的 toString 方法

use*_*552 5 vb.net enums enumeration tostring

我想为每个枚举值重写 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
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*mar 3

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

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

Module首先,使用以下代码将 a 添加到您的项目中:

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
Run Code Online (Sandbox Code Playgroud)

我们命名我们的函数是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
Run Code Online (Sandbox Code Playgroud)

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

例如

TextBox1.Text = Language_Culture_Names.English.ToString2()
Run Code Online (Sandbox Code Playgroud)

HTH。