首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于枚举的更优雅的设计

关于枚举的更优雅的设计
EN

Stack Overflow用户
提问于 2011-07-26 18:33:24
回答 9查看 537关注 0票数 6

我正在为C#学习。

我听说C#是最具可构造性的语言之一。所以你们能让我的代码更优雅更高效吗?

代码语言:javascript
复制
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;
        }
    }
}

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

有没有更有效的编码风格呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-07-26 18:38:08

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

代码语言:javascript
复制
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(); 

编辑:

代码语言:javascript
复制
    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;
        }
    }
票数 8
EN

Stack Overflow用户

发布于 2011-07-26 18:35:45

好的。您可以使用attributes

代码语言:javascript
复制
public enum ISO639Code
{
    [CodeString("af")] Afrikaans,
    [CodeString("sq")] Albanian,    
}
票数 8
EN

Stack Overflow用户

发布于 2011-07-26 18:36:48

使用字典,例如:new Dictionary<ISO639Code, string>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6828704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档