2010-06-23 242 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];