2009-10-30 5 views
5

tôi đã tự hỏi có hay không tôi có thể mở rộng các loại Enum trong C# để thực hiện Enum.GetValues ​​tùy chỉnh của tôi (loại) và gọi nó là như Enum.GetMyCustomValues ​​(loại)Mở rộng Enum trong C#

Tôi cố gắng để thực hiện một cái gì đó như thế này:

public static bool IsFlagSet<T>(this T value, T flag) where T : Enum 
{ 
    return (value & flag) != (T)0; 
} 

nhưng không thể thực hiện được ... bất kỳ công việc nào tôi có thể làm? Chúc mừng

+0

http://stackoverflow.com/questions/1415140/c-enums-can-my-enums-have-friendly-names –

+0

Có lẽ điều này? http://msdn.microsoft.com/en-us/library/bb383974.aspx – Asher

Trả lời

4

Tiện ích mở rộng hoạt động trên các trường hợp, không phải để tạo phương pháp tĩnh. Bạn có thể mở rộng cơ sở Enum bằng cách sử dụng public static void MyExtensions(this Enum value). Nhưng điều này sẽ vẫn chỉ tạo ra các phương thức trên các cá thể Enum mà bạn tạo ra. Cách duy nhất để thêm các phương thức tĩnh như bạn đang nói về bên ngoài cho một lớp là nếu lớp là một lớp một phần.

Edit: để làm điều gì đó như bạn muốn tôi viết sau đây cảnh báo

public static bool IsFlagSet<T>(this Enum value, Enum flag) 
{ 
    if (!typeof(T).IsEnum) throw new ArgumentException(); 
    if (value == flag) return true; 
    return ((int)Enum.Parse(typeof(T), value.ToString()) & 
     (int)Enum.Parse(typeof(T), flag.ToString())) != 0; 
} 

*, phương pháp này cần phải được nghĩ ra trước hơn để sử dụng, tôi hy vọng có một cách tốt hơn để làm điều đó .

+2

Không cần ràng buộc chung – shf301

2

Tôi nghĩ bạn có thể đang tìm kiếm các phương pháp mở rộng cho enums. Đây là liên kết bắt đầu: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

+0

Không thực sự những gì tôi đang tìm kiếm, quan tâm hơn đến việc mở rộng Enum.SomeMethod() thay vì MyCustomEnum.SomeMethod() – Joshscorp

+0

http: // web.archive.org/web/20100916130304/http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx, vì liên kết đã xuống cho tôi. – dividius

0

Đây là bài kiểm tra tốt nhất tôi có thể nghĩ đến. Hãy nhớ rằng enums có thể dựa trên 64 bit ints:

public static bool IsFlagSet(this Enum value, Enum flag) 
{ 
    if (Type.GetTypeHandle(value).Value != Type.GetTypeHandle(flag).Value) 
     throw new ArgumentException(); 
    return (Convert.ToInt64(value) & Convert.ToInt64(flag)) != 0L; 
} 
1

Và một ví dụ khác.

public static bool Includes<T>(this T value, T flag) where T : struct, IConvertible 
    { 
     var val = value.ToUInt32(null); 
     var fl = flag.ToUInt32(null); 
     return (val & fl) == fl; 
    } 

Và cách sử dụng.

SomeEnum val = SomeEnum.One; 
bool isOne = val.Includes(SomeEnum.One); // == true 
bool isTwo = val.Includes(SomeEnum.Two); // == false