2010-04-16 33 views
5

Tôi đã phương pháp sau đây trong một lớp enum helper (Tôi đã đơn giản hóa nó cho mục đích của câu hỏi):Có cách nào tốt hơn để tạo chuỗi chuyển đổi chung thành phương thức enum hoặc mở rộng enum không?

static class EnumHelper 
{ 
    public enum EnumType1 : int 
    { 
     Unknown = 0, 
     Yes = 1, 
     No = 2 
    } 

    public enum EnumType2 : int 
    { 
     Unknown = 0, 
     Dog = 1, 
     Cat = 2, 
     Bird = 3 
    } 

    public enum EnumType3 
    { 
     Unknown, 
     iPhone, 
     Andriod, 
     WindowsPhone7, 
     Palm 
    } 

    public static EnumType1 ConvertToEnumType1(string value) 
    { 
     return (string.IsNullOrEmpty(value)) ? 
      EnumType1.Unknown : 
      (EnumType1)(Enum.Parse(typeof(EnumType1), value, true)); 
    } 

    public static EnumType2 ConvertToEnumType2(string value) 
    { 
     return (string.IsNullOrEmpty(value)) ? 
      EnumType2.Unknown : 
      (EnumType2)(Enum.Parse(typeof(EnumType2), value, true)); 
    } 

    public static EnumType3 ConvertToEnumType3(string value) 
    { 
     return (string.IsNullOrEmpty(value)) ? 
      EnumType3.Unknown : 
      (EnumType3)(Enum.Parse(typeof(EnumType3), value, true)); 
    } 
} 

Vậy câu hỏi ở đây là, tôi có thể cắt này xuống một phương pháp mở rộng Enum hoặc có thể một số loại phương pháp duy nhất có thể xử lý bất kỳ loại nào. Tôi đã tìm thấy một số ví dụ để làm như vậy với enums cơ bản nhưng sự khác biệt trong ví dụ của tôi là tất cả các enums có mục Unknown mà tôi cần trả lại nếu chuỗi là null hoặc trống (nếu không có kết quả được tìm thấy tôi muốn nó thất bại).

Looking for giống như sau có thể:

EnumType1 value = EnumType1.Convert("Yes"); 
// or 
EnumType1 value = EnumHelper.Convert(EnumType1, "Yes"); 

Một chức năng để làm điều đó tất cả ... làm thế nào để xử lý các yếu tố Unknown là phần mà tôi đang treo lên trên.

Chỉnh sửa: Điều chỉnh một trong các enums không được xác định bằng số nguyên. Vì vậy, tôi có thể đảm bảo rằng 0 sẽ luôn luôn là trường hợp nhưng Unknown sẽ luôn luôn là văn bản chính xác ... Tôi đoán tôi có thể sử dụng ví dụ tương tự như T (0) nhưng làm một phân tích cú pháp trên văn bản "Không xác định".

Trả lời

8

Sử dụng này, giả định rằng Unknown luôn là giá trị 0.

public static T ConvertToEnum<T>(this string value) where T : new() 
{ 
    if(!typeof(T).IsEnum) 
     throw new NotSupportedException("T must be an Enum"); 

    try 
    { 
     return (T)Enum.Parse(typeof(T), value); 
    } 
    catch 
    { 
     return default(T); // equivalent to (T)0 
     //return (T)Enum.Parse(typeof(T), "Unknown")); 
    } 
} 

Cách sử dụng:

EnumType2 a = "Cat".ConvertToEnum<EnumType2>(); 
EnumType2 b = "Person".ConvertToEnum<EnumType2>(); // Unknown 

EDIT By OP (Kelsey): câu trả lời của bạn đưa tôi đến với câu trả lời đúng vì vậy tôi nghĩ tôi sẽ bao gồm nó ở đây:

public static T ConvertTo<T>(this string value) 
{ 
    T returnValue = (T)(Enum.Parse(typeof(T), "Unknown", true)); 
    if ((string.IsNullOrEmpty(value) == false) && 
     (typeof(T).IsEnum)) 
    { 
     try { returnValue = (T)(Enum.Parse(typeof(T), value, true)); } 
     catch { } 
    } 
    return returnValue; 
} 
+1

Hạn chế không thể là lớp đặc biệt 'System.Enum' –

+0

@ Maud'Dib: Ugh, bạn nói đúng. Tôi không thấy lỗi trong dự án giả của tôi. Tôi sẽ cập nhật. – chilltemp

+0

@ Kelsey: Quyền của bạn, bạn có thể chỉ đơn giản là reparse 'Không biết' mỗi lần, nhưng đúc từ 0 là hiệu quả hơn giả định rằng nó an toàn cho Enums của bạn. – chilltemp

2

Generics sử dụng ... một cái gì đó như thế này ....

public static TResult ConvertTo<TResult>(this string source) 
{ 
    if(!typeof(TResult).IsEnum) 
    { 
     throw new NotSupportedException("TResult must be an Enum"); 
    } 

    if (!Enum.GetNames(typeof(TResult)).Contains(source)) 
     return default(TResult); 


    return (TResult)Enum.Parse(typeof(TResult), source); 
} 

(the code came from here)

+0

tôi này biết làm thế nào để làm ... nhưng làm thế nào tôi sẽ nhận được 'EnumTypeX.Unknown' trở lại khi nó là null hoặc có sản phẩm nào? – Kelsey

+2

thêm dòng này ... if (! Enum.GetNames (typeof (TResult)). Chứa (nguồn)) trả về mặc định (TResult); –

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