2010-09-02 30 views
25

Tôi đã có một enum định nghĩa như thế nàyEnum to String?

enum Tile { Empty, White, Black }; 

Nhưng chúng ta hãy giả sử khi ghi vào giao diện điều khiển,

Console.Write(Tile.White); 

Tôi muốn nó in

W 

Hoặc bất kỳ khác giá trị, tôi có thể sử dụng một số switch cho điều này, nhưng có cách nào đẹp hơn không? Có lẽ sử dụng các thuộc tính?


Đây là những gì tôi có trong đầu. Viết một cái gì đó như thế này,

[AttributeUsage(AttributeTargets.Field)] 
public class ReprAttribute : Attribute 
{ 
    public string Representation; 
    public ReprAttribute(string representation) 
    { 
     this.Representation = representation; 
    } 
    public override string ToString() 
    { 
     return this.Representation; 
    } 
} 

enum Tile { 
    [Repr(".")] 
    Empty, 
    [Repr("W")] 
    White, 
    [Repr("B")] 
    Black 
}; 

// ... 
Console.Write(Tile.Empty) 

Sẽ in

. 

Tất nhiên, đó override string ToString() không làm những gì tôi đã hy vọng nó sẽ làm gì (nó vẫn kết quả đầu ra "Empty" để thay thế.


Bài viết này tóm tắt nó khá tốt: http://blogs.msdn.com/b/abhinaba/archive/2005/10/20/c-enum-and-overriding-tostring-on-it.aspx

+0

Sau đó, có thể bạn nên cụ thể hơn trong tương lai, chúng tôi không thể đọc được suy nghĩ. –

+0

@Arkain: Và tôi không thể dự đoán bạn sẽ giải thích cho tôi như thế nào. Điều rõ ràng trong tâm trí bạn không phải lúc nào cũng rõ ràng trong người khác. Bạn đã từng nói chuyện với khách hàng chưa? – mpen

+0

Thay vì bắt snide, hãy nêu rõ các yêu cầu của bạn rõ ràng như ban ngày;) Không có chỗ để giải thích. –

Trả lời

49

Bạn có thể sử dụng:

using System.ComponentModel; 

public enum Tile 
{ 
    [Description("E")] 
    Empty, 

    [Description("W")] 
    White, 

    [Description("B")] 
    Black 
} 

Và một phương pháp helper:

public static class ReflectionHelpers 
{ 
    public static string GetCustomDescription(object objEnum) 
    { 
     var fi = objEnum.GetType().GetField(objEnum.ToString()); 
     var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 
     return (attributes.Length > 0) ? attributes[0].Description : objEnum.ToString(); 
    } 

    public static string Description(this Enum value) 
    { 
     return GetCustomDescription(value); 
    } 
} 

Cách sử dụng:

Console.Write(Tile.Description()); 
+0

Đó là gần với những gì tôi đã có trong tâm trí ... nhưng tôi đã hy vọng tôi có thể thả '.Description()' bit, và nó sẽ chỉ gọi bất kỳ phương thức chuyển đổi/chuỗi nào khi tôi cố gắng in trực tiếp hình xếp. Về cơ bản, ghi đè phương thức 'ToString()' với một giá trị nó nhận được từ thuộc tính thay vào đó. – mpen

+0

Tôi sẽ cung cấp cho bạn kiểm tra để được gần nhất với những gì tôi đã sau; có vẻ như bạn không thể làm điều đó mà không gọi phương thức chuyển đổi một cách rõ ràng. – mpen

10

Bạn có thể sử dụng phương thức ToString():

Tile t = Tile.White; 
Console.WriteLine(t.ToString()); // prints "White" 
Console.WriteLine(t.ToString().SubString(0, 1)); // prints "W" 
2

Bạn có thể sử dụng một sự kết hợp của Enum.GetNameSubstring.

cái gì đó dọc theo dòng:

private string GetShortName(Tile t) 
{ 
    return Enum.GetName(typeof(Tile), t).Substring(0, 1); 
} 

... 

Console.WriteLine(GetShortName(Tile.White)); 
0

Bạn có thể thử như sau:

private string GetFirstEnumLetter(Tile tile) 
{ 
    if (tile.ToString().Length > 0) 
    { 
     return tile.ToString().Substring(0, 1); 
    } 

    return string.Empty; 
} 

Và sau đó chuyển đổi nó mỗi khi bạn muốn bằng cách gọi:

Console.Write(GetFirstEnumLetter(Tile.White)); 

Hy vọng rằng giúp.

thuộc tính
15

Các ngây thơ không thuộc tính cách:

public enum Tile { 
    White = 'W', 
    Black = 'B' 
} 
//... 
System.Diagnostics.Debug.WriteLine(string.Format("{0} - {1}", Tile.White.ToString(), (char)Tile.White)); 
//Prints out: 
//White - W 
4
Enum.GetName(typeof(Tile), enumvalue) 

Điều này sẽ nhận được enum dưới dạng chuỗi.

0

Trong Java, bạn sẽ làm điều này (đã viết điều này trước khi nhận thấy đây là một câu hỏi C#, xin lỗi! Nhưng nó có thể hữu ích cho ai đó ...):

public enum Tile { 

    Empty ("."), White ("W"), Black ("B") ; 

    private String abbr; 

     //Note this is private 
    private Tile (String abbr) { 

     this.abbr = abbr; 
    } 

    public String getAbbr() { 

     return abbr; 
    } 

     //The following is only necessary if you need to get an enum type for an abbreviation 
    private static final Map<String, Tile> lookup = new HashMap<String, Tile>(); 

    static { 
     for (Tile t : EnumSet.allOf(Tile.class)) 
      lookup.put(t.getAbbr(), t); 
    } 

    public static Tile get (String abbr) { 

     return lookup.get(abbr); 
    } 
} 

public class TestTile { 

public static void main (String[] args) { 

    System.out.println(Tile.Black.getAbbr()); 
    System.out.println(Tile.White.getAbbr()); 
    System.out.println(Tile.Empty.getAbbr()); 

    System.out.println(Tile.get("W")); 

} 

} 

Output:

B

W

.

Trắng

Điều này cho phép bạn dịch hai chiều vào và ra khỏi môi trường.

Bạn không thể chỉ in Tile.White và mong đợi nó in một cái gì đó khác, vì vậy bạn cần phải gọi Tile.White.getAbbr(). Chỉ cần in Tile.White sẽ gọi toString() trên enum, sẽ in tên. Tôi đoán bạn có thể ghi đè lênString() nếu bạn thực sự muốn:

public String toString(){ 
    return getAbbr(); 
}