2009-07-13 33 views
15

Có cách nào để đặt dấu cách vào hằng số C# enum không? Tôi đã đọc mà bạn có thể làm điều đó trong VB bằng cách làm này:Không gian trong C# Enums

Public Enum EnumWithSpaces 
    ConstantWithoutSpaces 
    [Constant With Spaces] 
End Enum 

... và sau đó truy cập vào nó như thế này:

Public Sub UsingEnumWithSpaces() 

    Dim foo As EnumWithSpaces = EnumWithSpaces.[Constant With Spaces] 

End Sub 

Điều đó hàm ý với tôi rằng CLR có thể xử lý một enum với không gian.

Có cách nào để thực hiện việc này trong C# không?

Trả lời

36

bài viết trên blog này có thể giúp bạn:

http://blog.spontaneouspublicity.com/2008/01/17/associating-strings-with-enums-in-c/

Từ bài viết:

Nhưng enums không thể có khoảng trống trong C#" bạn nói Vâng. , Tôi muốn sử dụng System.ComponentModel.DescriptionAttribute để thêm mô tả thân thiện hơn với giá trị enum. Ví dụ enum có thể được viết lại như thế này:

public enum States 
{ 
    California, 
    [Description("New Mexico")] 
    NewMexico, 
    [Description("New York")] 
    NewYork, 
    [Description("South Carolina")] 
    SouthCarolina, 
    Tennessee, 
    Washington 
} 

Chú ý rằng tôi không đặt giới thiệu vào các mặt hàng mà phiên bản ToString() đó hiển thị item tốt.

+0

Cảm ơn Giu-đa đã cố gắng làm sạch điều này cho tôi. Tôi đã có một heck của một thời gian cố gắng để làm cho nó nhìn bên phải. –

+2

Điều này sẽ rất tuyệt nếu ToString tự động sử dụng thuộc tính. Vì nó đứng, mặc dù, nó không phải là tất cả những gì hữu ích. –

+0

Tôi đoán bạn luôn có thể sử dụng 'DescriptionAttribute' cùng với phương thức mở rộng' ToDescription'. – cdmckay

9

CLR có thể xử lý hoàn toàn bất kỳ ký tự nào trong số nhận dạng. Tuy nhiên, C# hạn chế các ký tự định danh cho các ký tự hợp pháp theo CLS, không gian nào không. Cùng đi cho VB.NET, bằng cách này - không gian bên trong dấu ngoặc vuông được sử dụng để làm việc trong VB6, nhưng họ không trong VB.NET.

+0

Có cách nào bạn có thể sửa đổi hằng số enum bằng phản chiếu không? – cdmckay

+0

Bạn có nghĩa là tải một assembly được biên dịch và xử lý nó để thay thế các tên enum, hoặc sửa đổi hằng số tại thời gian chạy? Sau này là không thể; trước đây là, nhưng tôi nghĩ nó sẽ đơn giản hơn để sử dụng 'ildasm' để tháo rời nó, thay thế tên khi cần thiết (điều này có thể được tự động với regex), và sử dụng' ilasm' để làm cho nó trở thành một hội đồng một lần nữa. Ngoài ra, bạn có thể khai báo enum của bạn trong IL ở nơi đầu tiên, sử dụng 'ilasm' để biên dịch nó thành một .netmodule, và sau đó liên kết mô-đun đó vào trong C#/VB assembly của bạn. –

+0

Tôi đã kết thúc chỉ bằng cách sử dụng 'DescriptionAttribute' và sau đó viết lớp tĩnh của riêng tôi để truy cập enum như thể' DescriptionAttribute's là các hằng số. – cdmckay

0

Nếu bạn đang làm việc với Visual C# 3.0 hoặc cao hơn tôi đã tìm thấy nó thuận tiện để chỉ mở rộng các lớp enum và sử dụng một regex để inset không gian nơi cần thiết:

public static class EnumExtension 
{ 
    public static String ToDisplayString(this Enum e) 
    { 
     Regex regex = new Regex(@"([^\^])([A-Z][a-z$])"); 

     return regex.Replace(e.ToString(), new MatchEvaluator(m => 
     { 
      return String.Format("{0} {1}", m.Groups[1].Value, m.Groups[2].Value); 
     })); 
    } 
} 

Thông báo này cho phép bạn làm việc với bất kỳ enum như là không có thêm mô tả cho mọi giá trị.

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();