2013-06-21 18 views
10

Làm thế nào tôi có thể có aC# enum rằng nếu tôi đã chọn để chuỗi nó trả về một chuỗi khác nhau, như trong java nó có thể được thực hiện bằng cáchThay đổi enum hiển thị

public enum sample{ 
    some, other, things; 

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

Console.writeln(sample.some) chí đầu ra:

you choose some 

tôi chỉ muốn enums của tôi để trở về một chuỗi khác nhau khi tôi cố gắng gọi cho họ.

+0

cậu thử làm gì? Hay nó thất bại ở đâu? – Kangkan

+2

@Kangkan - vì bạn không thể lấy được từ enum trong C# không có gì để thử trực tiếp ... –

Trả lời

12

Theo hiểu biết của tôi, điều này là không thể. Tuy nhiên, bạn có thể viết một phương pháp mở rộng mà được một số chuỗi khác:

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

Bây giờ, chỉ cần gọi mới ToSampleString này về trường hợp của SampleEnum:

mySampleEnum.ToSampleString(); 

Nếu bạn không quen với phương pháp khuyến nông trong C#, đọc thêm here.

Một tùy chọn khác là sử dụng thuộc tính Description phía trên mỗi giá trị enum, như được mô tả here.

+0

Bạn có thể sử dụng kết hợp mô tả trên lớp enum cũng như giá trị enum để tạo một thông báo chung được xác định một lần , với phương pháp mở rộng để soạn nó lại với nhau.Sẽ làm cho một phương pháp mở rộng tái sử dụng nhiều hơn nữa. +1 – Phill

+1

Tại sao quá phức tạp để truy lục thuộc tính Mô tả? – CodeCamper

+1

Nhận thuộc tính Mô tả chỉ phức tạp một lần. Bạn thêm nó như là một phương pháp mở rộng và có sẵn cho tất cả các Enums và không nhìn vào nó nữa. Sử dụng câu trả lời ở trên, bạn sẽ phải tạo một phương thức như thế này cho mỗi Enum. Bạn có thể xem một ví dụ điển hình ở đây: http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx –

3

Bạn muốn có từ điển. Một điều tra liệt kê (đưa ra một số) cho các giá trị của nó. Bạn muốn một giá trị chuỗi được trả lại khi bạn cung cấp một khóa chuỗi. Hãy thử một cái gì đó như:

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"); 

Sau đó, mã này:

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

sẽ trở lại "bạn chọn một số"

0

Nếu bạn chỉ muốn để có được Enum như chuỗi bạn có thể sử dụng phương pháp này:

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

Phương thức này sẽ trả về tên của Enum thay vì int.

4

Tôi sẽ làm điều đó một cách trang nhã bằng cách tạo thuộc tính, ví dụ: Mô tả và trang trí các giá trị enum với nó.

ví dụ:

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

Sau đó, sử dụng GetCustomAttributes để đọc/hiển thị giá trị. http://msdn.microsoft.com/en-us/library/system.attribute.getcustomattributes.aspx

@CodeCamper Xin lỗi về sự chậm phản ứng nhưng đây là một số mã ví dụ để đọc DescriptionAttribute: Phương pháp

Extension:

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; 
    } 
} 

Cách sử dụng:

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

Tôi đã đọc các bài viết về cách thực hiện điều này và dường như quá phức tạp vì một số lý do. Bạn có thể vui lòng hiển thị các dòng mã đơn giản và ít nhất để lấy Mô tả không? – CodeCamper

+0

@CodeCamper Tôi đã thêm mã ví dụ vào câu trả lời của mình ở trên. – lahsrah

+0

Cảm ơn bạn đã bổ sung! +1 – CodeCamper