2011-11-01 35 views
12

Về cơ bản, một loạt tiêu đề sẽ được chuyển vào câu lệnh chuyển đổi và tôi cần so sánh chúng với giá trị chuỗi của enum. Nhưng tôi có ít hoặc không có ý tưởng làm thế nào để làm điều này một cách chính xác.Cách gán giá trị chuỗi cho enums và sử dụng giá trị đó trong một công tắc

Ngoài ra, tôi không biết đây có phải là cách tiếp cận tốt nhất vì vậy nếu có ai có ý tưởng nào không?

Ví dụ:

enum 
{ 
    doctor = "doctor", 
    mr = "mr", 
    mrs = "mrs" 
} 

và sau đó chuyển qua các giá trị chuỗi tôi đã gán cho họ.

Trả lời

9

Bạn không thể có một enum với một kiểu cơ bản của string. The underlying type can be any integral type except char.

Nếu bạn muốn dịch string thành enum thì có thể bạn sẽ cần sử dụng phương thức Parse hoặc TryParse.

string incoming = "doctor"; 

// throws an exception if the string can't be parsed as a TestEnum 
TestEnum foo = (TestEnum)Enum.Parse(typeof(TestEnum), incoming, true); 

// try to parse the string as a TestEnum without throwing an exception 
TestEnum bar; 
if (Enum.TryParse(incoming, true, out bar)) 
{ 
    // success 
} 
else 
{ 
    // the string isn't an element of TestEnum 
} 

// ... 

enum TestEnum 
{ 
    Doctor, Mr, Mrs 
} 
0

Đọc một số this tutorial để hiểu cách hoạt động của enums. Có các ví dụ về các câu lệnh switch.

+0

Tôi lướt qua nhưng không thấy bất kỳ điều gì về việc gán giá trị chuỗi tại đó. – ediblecode

3

Số đếm không thể là loại chuỗi.

Các loại được chấp nhận cho enum là byte, sbyte, short, ushort, int, uint, long hoặc ulong.

http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

+0

Tôi không nói tôi muốn nó thuộc loại chuỗi. Tôi đã nói tôi muốn gán một giá trị chuỗi cho nó. Tôi đã nhìn thấy nó được thực hiện trước và muốn biết làm thế nào để thực hiện nó. – ediblecode

+0

Lời xin lỗi của tôi sau đó, tôi đọc nó như là điều tương tự kể từ khi các giá trị cơ bản là loại của enum. – Jay

4

Đây không phải là loại điều cần được mã hóa cứng. Nó phải được định hướng dữ liệu, có thể đọc từ một tệp hoặc cơ sở dữ liệu bên ngoài. Bạn có thể lưu trữ chúng trong một Dictionary và sử dụng các phím để lái xe logic của bạn.

+0

Tôi nghĩ vậy. Cảm ơn bạn – ediblecode

+0

Mô tả enum mã hóa cứng không chính xác hơn các lớp đặt tên sau đối tượng miền thế giới thực. Đôi khi một Fish.BabelFish sẽ luôn luôn là một "Babel cá". Một trường hợp có thể được thực hiện để nhận được các giá trị từ một nguồn tài nguyên bản địa hóa (cho toàn cầu hoá), nhưng bạn không phải lấy mọi thông tin từ một cơ sở dữ liệu hoặc tệp bên ngoài. –

3

Enum chỉ có thể có các loại cơ bản tách rời (trừ char). Do đó bạn không thể làm những gì bạn muốn, ít nhất là trực tiếp.

Tuy nhiên bạn có thể dịch các chuỗi bạn phải kiểu enum:

EnumType eVal = (EnumType)Enum.Parse(typeof(EnumType), strValue); 

switch(eVal) 
{ 
    case EnumType.doctor:/*...*/; break; 
    case EnumType.mr: /*...*/; break; 
} 
1

Tại sao không sử dụng chỉ enum tinh khiết và công tắc?

enum Prefix 
{ 
    doctor, 
    mr, 
    mrs 
} 

Sau đó, bạn có thể sử dụng giống như

string case = "doctor"; 

switch ((Prefix)Enum.Parse(typeof(Prefix), "doctor")) 
{ 
    case Prefix.doctor: 
     ... 
     break; 
    ... 
    default: 
     break; 
} 
+0

enums phải là một từ, vì vậy Lance Corporal chẳng hạn, sẽ gây ra vấn đề cho tôi – ediblecode

+1

bạn có thể tạo bản đồ 'Dictionary map', điền vào nó, sau đó đưa ra một chuỗi" Lance Corporal " (như 'Tiền tố p = bản đồ [" Lance Corporal "];') và thực hiện một công tắc trên kiểu enum. –

2

Tôi tin rằng cách tiêu chuẩn để làm điều này là sử dụng một lớp tĩnh với tính chuỗi readonly mà trả về giá trị mà bạn muốn.

16

Tôi thấy rằng cách tốt nhất để tôi làm điều này là sử dụng thuộc tính System.ComponentModel.Description trên các giá trị enum.

Dưới đây là một ví dụ:

using System.ComponentModel; 

public enum ActionCode 
{ 
    [Description("E")] 
    Edit, 
    [Description("D")] 
    Delete, 
    [Description("R")] 
    Restore 
} 

Sau đó, để sử dụng nó, tạo ra một phương pháp khuyến nông trên một lớp tĩnh như vậy:

Edit: Tôi viết lại mã gốc là một phương pháp khuyến nông chung trên một lớp thực hiện IConvertible (Enum triển khai giao diện này, vì vậy nó hoạt động theo cách chúng ta cần). Dưới đây là một phương pháp chung mà hoạt động trên tất cả enums:

public static string GetDescription<T>(this T e) where T : IConvertible 
{ 
    if (e is Enum) 
    { 
     Type type = e.GetType(); 
     Array values = System.Enum.GetValues(type); 

     foreach (int val in values) 
     { 
      if (val == e.ToInt32(CultureInfo.InvariantCulture)) 
      { 
       var memInfo = type.GetMember(type.GetEnumName(val)); 
       var descriptionAttribute = memInfo[0] 
        .GetCustomAttributes(typeof(DescriptionAttribute), false) 
        .FirstOrDefault() as DescriptionAttribute; 

       if (descriptionAttribute != null) 
       { 
        return descriptionAttribute.Description; 
       } 
      } 
     } 
    } 

    return null; // could also return string.Empty 
} 

Vì vậy, để có được chuỗi kết hợp với enum của chúng tôi ở trên, chúng ta có thể sử dụng đoạn mã sau:

using Your.Extension.Method.Namespace; 

... 

ActionCode action = ActionCode.Edit; 
string actionDescription = action.GetDescription(); 

// value of actionDescription will be "E" 

Dưới đây là một mẫu Enum:

public enum TestEnum 
{ 
    [Description("This is test 1")] 
    Test1, 
    [Description("This is test 2")] 
    Test2, 
    [Description("This is test 3")] 
    Test3 

} 

đây là đoạn mã để xem mô tả:

TestEnum test = TestEnum.Test2; 
var testDescription = test.GetDescription(); 

Kết quả sẽ là:

"This is test 2" 

tôi muốn đi trước và đăng các phương pháp chung chung vì nó là nhiều hơn nữa hữu ích. Nó ngăn cản bạn phải viết một phần mở rộng tùy chỉnh cho tất cả các enums của bạn.

+0

tuyệt vời với chi tiết được upvoted – MonsterMMORPG

1

Tôi muốn thêm câu trả lời khác cho bất kỳ ai sử dụng C# 6 trở lên.

Nếu bạn chỉ muốn lấy tên của giá trị Enum, bạn có thể sử dụng nameof mới() phương pháp giới thiệu trong C# 6.

string enumName = nameof(MyEnum.EnumVal1); // enumName will equal "EnumVal1" 

Trong khi điều này có vẻ như quá mức cần thiết ở cái nhìn đầu tiên (tại sao không chỉ đặt giá trị của chuỗi thành "EnumVal1" để bắt đầu bằng?), nó sẽ cung cấp cho bạn kiểm tra thời gian biên dịch để đảm bảo giá trị hợp lệ. Vì vậy, nếu bạn đã bao giờ thay đổi tên của giá trị enum và quên nói với IDE của bạn để tìm và thay thế tất cả các tham chiếu, nó sẽ không biên dịch cho đến khi bạn sửa chúng.

Các vấn đề liên quan