2013-06-21 98 views
10

我怎麼能有一個C#枚舉,如果我選擇了字符串,返回不同的字符串,就像在java中它可以通過更改枚舉顯示

public enum sample{ 
    some, other, things; 

    public string toString(){ 
     switch(this){ 
      case some: return "you choose some"; 
      default: break; 
     } 
    } 
} 

Console.writeln(sample.some)將輸出來完成:

you choose some 

我只是想讓我的枚舉在我嘗試調用它們時返回不同的字符串。

+0

那你試試?或者它在哪裏失敗? – Kangkan

+2

@Kangkan - 因爲你不能從C#中的枚舉中派生出來,所以沒有什麼可以直接嘗試...... –

回答

12

據我所知,這是不可能的。但是,您可以編寫得到了一些其他字符串的擴展方法:

public static class EnumExtensions 
{ 
    public static string ToSampleString(this SampleEnum enum) 
    { 
     switch(enum) 
     { 
      case SampleEnum.Value1 : return "Foo"; 
      etc. 
     } 
    } 
} 

現在,只需把這種新的ToSampleString上的SampleEnum實例:

mySampleEnum.ToSampleString(); 

如果你不熟悉的C#擴展方法,閱讀更多here

另一種選擇是使用enum以上的Description屬性值,如here所述。

+0

你可以使用enum類的描述以及enum值的組合來創建一次定義的通用消息,用擴展方法將它們組合在一起。會爲更可重用的擴展方法。 +1 – Phill

+1

爲什麼檢索Description屬性如此複雜? – CodeCamper

+1

獲取描述屬性只是複雜一次。您將其添加爲擴展方法,並可用於所有枚舉,不要再看它。使用這個上面的答案,你必須爲每個Enum創建一個像這樣的方法。你可以看看這裏的一個很好的例子:http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx –

3

你想要一本詞典。枚舉數枚舉(給出一個數字)的值。您希望在提供字符串鍵時返回字符串值。嘗試是這樣的:

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
dictionary.Add("some", "you choose some"); 
dictionary.Add("other", "you choose other"); 
dictionary.Add("things", "you choose things"); 

那麼這個代碼:

string value = dictionary["some"]; 
Console.writeln(value); 

將返回「你選擇一些」

0

如果你只是想獲得枚舉的字符串,你可以使用這個方法:

Enum.GetName(typeof(sample), value); 

此方法將返回Enum的名稱而不是int。

4

我會通過創建一個屬性來裝飾性地完成它,例如使用它描述和裝飾枚舉值。

例如

public enum Rate 
{ 
    [Description("Flat Rate")] 
    Flat, 
    [Description("Time and Materials")] 
    TM 
} 

然後用GetCustomAttributes來讀取/顯示這些值。 http://msdn.microsoft.com/en-us/library/system.attribute.getcustomattributes.aspx

@CodeCamper很抱歉的響應遲,但這裏的一些示例代碼讀取DescriptionAttribute:

擴展方法:

public static class EnumExtensions 
{ 
    public static string Description<T>(this T t) 
    { 
     var descriptionAttribute = (DescriptionAttribute) typeof (T).GetMember(t.ToString()) 
            .First().GetCustomAttribute(typeof (DescriptionAttribute)); 

     return descriptionAttribute == null ? "" : descriptionAttribute.Description; 
    } 
} 

用法:

Rate currentRate = Rate.TM; 
Console.WriteLine(currentRate.Description()); 
+0

我一直在閱讀關於如何做到這一點的文章,並且由於某種原因它看起來過於複雜。你可以請顯示最簡單和最少的代碼行來檢索描述? – CodeCamper

+0

@CodeCamper我在上面的答案中添加了示例代碼。 – lahsrah

+0

謝謝您的補充! +1 – CodeCamper