2010-06-23 158 views
1

所以我想要一个属性getter,它返回基于不同类型的枚举值的枚举值,而不必求助于长开关语句。有没有办法使用索引或值匹配两个枚举列表?C#:基于不同枚举类型的枚举值返回枚举值

public enum LanguageName 
    { 
     Arabic, 
     Chinese, 
     Dutch, 
     English, 
     Farsi, 
     French, 
     Hindi, 
     Indonesian, 
     Portuguese, 
     Spanish, 
     Urdu 
    } 

    public enum LanguageISOCode 
    { 
     ara, 
     zho, 
     dut, 
     eng, 
     fas, 
     fre, 
     hin, 
     ind, 
     por, 
     spa, 
     urd 
    } 

public class language 
{ 
    public language() 
    { 
    } 

    public LanguageName Name 
    { 
     get 
     { 
      // get the Name enum based on the Code enum 
     } 
     set; 
    } 

    public LanguageISOCode Code 
    { 
     get; 
     set; 
    } 
} 

回答

8

可以明确地声明一个枚举值等于另一个,就像这样:

LanguageISOCode codeValue = LanguageISOCode.ara; 

LanguageName name = (LanguageName)(int)codeValue; 

public enum LanguageName 
{ 
    Arabic, 
    Chinese, 
    Dutch, 
    ... 
} 

public enum LanguageISOCode 
{ 
    ara = LanguageName.Arabic, 
    zho = LanguageName.Chinese, 
    dut = LanguageName.Dutch, 
    ... 
} 

那么这将让你它们之间的投

LanguageName nameValue = LanguageName.Arabic; 

LanguageISOCode = (LanguageISOCode)(int)nameValue; 

虽然上面应该回答你明确的问题,你应该看看System.Globalization.CultureInfo类。它提供了很多有关各种文化的功能。

+0

谢谢!你给我的东西,我怀疑是可能的。感谢您提及CultureInfo类。 – 2010-06-23 15:09:10

+0

非常好,就是我在找的东西! – 2010-12-11 04:34:41

2

假设值是相同的顺序,你可以去通过int转换第一:

public LanguageName Name 
{ 
    get 
    { 
     int n = (int) Code; 
     return (LanguageName)n; 
    } 
} 

这将需要确保你的枚举值总是在正确的顺序,或您明确分配这些数值:

public enum LanguageName 
{ 
    Arabic = 1, 
    Chinese = 2, 
    ... 
} 

public enum LanguageISOCode 
{ 
    ara = 1, 
    zho = 2, 
    ... 
} 

以上是不需要(因为标准保证他们获得分配单调increa唱数字值),但至少在你决定重新排序字段或类似的情况下,它会覆盖你。

1

您可以在两者中使用相同的int值,并将其转换为int并将其强制转换为enum。

public enum LanguageName 
    { 
     Arabic = 1, 
     Chinese, 
     Dutch, 
     English, 
     Farsi, 
     French, 
     Hindi, 
     Indonesian, 
     Portuguese, 
     Spanish, 
     Urdu 
    } 

    public enum LanguageISOCode 
    { 
     ara = 1, 
     zho, 
     dut, 
     eng, 
     fas, 
     fre, 
     hin, 
     ind, 
     por, 
     spa, 
     urd 
    } 

public class language 
{ 
    public language() 
    { 
    } 

    public LanguageName Name 
    { 
     get 
     { 
      return (LanguageName)((int)Code); 
     } 
     set; 
    } 

    public LanguageISOCode Code 
    { 
     get; 
     set; 
    } 
} 

或者您可以使用其他方法,如使用[Description]并进行一些搜索。

3

您可以使用Dictionary<LanguageName, LanguageISOCode>将一个显式映射到另一个。

Dictionary<LanguageName, LanguageISOCode> languageCodes = new Dictionary<LanguageName, LanguageISOCode> { 
    {LanguageName.Arabic,LanguageISOCode.ara}, 
    {LanguageName.Chinese,LanguageISOCode.zho}, 
    //... 
}; 

LanguageName lang = LanguageName.Arabic; 
LanguageISOCode code = languageCodes[lang];