2013-04-06 30 views
7

Tôi gặp vấn đề khi tìm hiểu cách tạo chính xác một thể hiện của enum khi tôi chạy System.Type của enum và đã kiểm tra BaseType là System .Enum, giá trị của tôi là một giá trị int phù hợp với một mục trong Enum bí ẩn.Tạo thể hiện của Enum không xác định với giá trị chuỗi bằng cách sử dụng phản chiếu trong C#

Mã tôi có cho đến nay chỉ là logic được mô tả ở trên như được hiển thị bên dưới.

 if (Type.GetType(type) != null) 
     { 
      if (Type.GetType(type).BaseType.ToString() == "System.Enum") 
      { 
       return ???; 
      } 
     } 

Khi làm việc với Enums trong quá khứ tôi đã luôn biết lúc mã mà enum tôi đang cố gắng để phân tích nhưng trong kịch bản này im bối rối và đã có chút may mắn khớp nối câu hỏi của tôi một cách thân thiện với google ... Tôi thường sẽ làm điều gì đó như

(SomeEnumType)int 

nhưng vì tôi không biết EnumType tại thời điểm mã như thế nào tôi có thể đạt được điều tương tự?

+0

Nó là một chút khó hiểu những gì bạn muốn làm sau khi "trở lại ???", và tại sao bạn cần phải suy nghĩ trong trường hợp này. Bạn vẫn có thể làm tương tự (SomeEnumType) loại để đúc loại để SomeEnumType. – outcoldman

+0

Vấn đề là tôi không biết Enum có thể là gì, thời gian chạy có thể là bất kỳ .. Sự trở lại ??? sẽ là một cái gì đó như [code] Enum.Parse (Type.GetType (type), ob); [/ code] –

+0

Dòng này 'Type.GetType (type) .BaseType.ToString() ==" System.Enum " 'nói với tôi rằng đối tượng' type' đã có kiểu 'SomeEnumType' của bạn, vậy tại sao bạn cần chuyển đổi nó từ' SomeEnumType' thành 'SomeEnumType'? Bạn có thể cung cấp thêm thông tin về những gì bạn muốn đạt được với điều này? – outcoldman

Trả lời

10

Sử dụng phương pháp ToObject trên lớp Enum:

var enumValue = Enum.ToObject(type, value); 

Hoặc như đoạn code mà bạn cung cấp:

if (Type.GetType(type) != null) 
{ 
    var enumType = Type.GetType(type); 
    if (enumType.IsEnum) 
    { 
     return Enum.ToObject(enumType, value); 
    } 
} 
+1

Thay vì 'enumType.BaseType == typeof (Enum)' nó dễ dàng hơn (và có lẽ tương đương) để viết 'enumType.IsEnum'. –

+0

Tại sao bạn rời phương thức 'Enum.ToObject'? Tôi thích nó nhiều hơn là đi qua một ví dụ 'string' như bạn làm bây giờ. –

0

Sử dụng (ENUMName)Enum.Parse(typeof(ENUMName), integerValue.ToString())

như một chức năng chung (chỉnh sửa để sửa lỗi cú pháp) ...

public static E GetEnumValue<E>(Type enumType, int value) 
         where E : struct 
    { 
     if (!(enumType.IsEnum)) throw new ArgumentException("Not an Enum"); 
     if (typeof(E) != enumType) 
      throw new ArgumentException(
       $"Type {enumType} is not an {typeof(E)}"); 
     return (E)Enum.Parse(enumType, value.ToString()); 
    } 

cũ phiên bản sai:

public E GetEnumValue(Type enumType, int value) where E: struct 
{ 
    if(!(enumType.IsEnum)) throw ArgumentException("Not an Enum"); 
    if (!(typeof(E) is enumType)) 
     throw ArgumentException(string.format(
      "Type {0} is not an {1}", enumType, typeof(E)); 
    return Enum.Parse(enumType, value.ToString()); 
} 
+1

Điều này có vẻ sai trong một vài cách. (1) Phương thức của bạn có ràng buộc 'where', nhưng bạn quên" định nghĩa "kiểu' E' và làm cho phương thức của bạn chung chung. (2) Làm thế nào để cung cấp 'E' khi gọi phương thức? Nó sẽ không được suy ra bởi trình biên dịch. (3) Biểu thức 'is' của bạn sai cú pháp. Phía bên phải của 'is' là một đối tượng, không phải là một loại. Có lẽ bạn muốn sử dụng '! =' Thay vì 'is'? Mục đích là gì? (4) Kiểu trả về yêu cầu bạn đưa đầu ra từ phương thức 'Enum.Parse' không chung chung. –

+0

Xin lỗi, nhập mà không cần kiểm tra biên dịch. Đã chỉnh sửa để sửa lỗi cú pháp. –

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