关于枚举更优雅的设计

mjk*_*026 7 c# enums

我正在学习C#.

我听说C#是最具建设性的语言之一.那么你们会让我的代码更加优雅和高效吗?

public class ISO639
{
    public enum ISO639Code
    {
        Afrikaans,                      //af
        Albanian,                       //sq
        Amharic,                        //am

        ...

        Yiddish,                        //yi
        Unknown                         
    }


    public static string GetISO639CodeString(ISO639.ISO639Code l)
    {
        switch (l)
        {
            case ISO639Code.English: return "en";
            case ISO639Code.Japanese: return "ja";

            ...

            case ISO639Code.Hebrew: return "he";
            default: return "";
        }


    public static ISO639.ISO639Code GetISO39CodeValue(string s)
    {

        switch (s)
        {
            case "ko" : return ISO639Code.Korean;
            case "en" : return ISO639Code.English;

            ...

            case "hu" : return ISO639Code.Hungarian;
            default: return ISO639Code.Unknown;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的班级ISO639.此类为ISO639代码提供枚举,但我需要从ISO639枚举到纯字符串的类型转换.(例如ISO639.ISO639Code.Italian =>"it").我还需要从普通字符串到ISO639枚举的类型转换.(例如"it"=> ISO639.ISO639Code.Italian).

是否有更有效的编码风格?

sll*_*sll 9

您可以将标准 System.ComponentModel.Description属性添加到每个枚举条目,然后读取它.

public enum ISO639Code       
{ 
  [Description("af")]
  Afrikaans
}

public static class EnumExtensions
{
    // Extension method to read Description value
    public static string GetDescription(this Enum currentEnum)
    {
         var fi = currentEnum.GetType().GetField(currentEnum.ToString()); 
         var da = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute)); 
         return da != null ? da.Description : currentEnum.ToString();
     } 
}

// **How-to read it**
ISO639Code isoCode = ISO639Code.Afrikaans;

// this will returns "af"
string isoDescription = isoCode.GetDescription(); 
Run Code Online (Sandbox Code Playgroud)

编辑:

    string searchFor = "af"; 
    ISO639Code foundEntry;

    // Loop through all entries descriptions       
    var allEntries = Enum.GetValues(typeof(ISO639Code));
    foreach (var entry in allEntries)
    {
        // If you will extract this as separate method and use it for search not only loop
        // through the all entries - you can put here is yield return description
        var currentEntry = ((ISO639Code)entry);
        string description = currentEntry.GetDescription();
        if (description == searchFor)
        {
            foundEntry = currentEntry;
            break;
        }
    }
Run Code Online (Sandbox Code Playgroud)


Ant*_*lev 8

当然.您可以使用属性:

public enum ISO639Code
{
    [CodeString("af")] Afrikaans,
    [CodeString("sq")] Albanian,    
}
Run Code Online (Sandbox Code Playgroud)

  • @Sheldon你需要使用反射和`Attribute.GetCustomAttribute`,通常在内存中的某个地方缓存这些数据,以避免每次都计算它 (5认同)
  • 看一下`DescriptionAttribute`:http://msdn.microsoft.com/en-us/library/system.componentmodel.descriptionattribute.aspx (2认同)