2009-10-30 186 views
5

我不知道我是否能在C#擴展枚舉類型來實現我的自定義Enum.GetValues(型),並調用它像Enum.GetMyCustomValues(類型)擴展枚舉在C#

我想實現是這樣的:

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

,但它不能做...... 任何變通,我能做什麼? 乾杯

+0

http://stackoverflow.com/questions/1415140/c-enums-can-my-enums-have-friendly-names – 2009-10-30 02:19:15

+0

也許這? http://msdn.microsoft.com/en-us/library/bb383974.aspx – Asher 2011-02-04 08:56:35

回答

4

擴展插件適用於實例,不適用於創建靜態方法。您可以使用public static void MyExtensions(this Enum value)擴展基本Enum。但是這仍然只會在您創建的Enum實例上創建方法。添加靜態方法的唯一方法就是如果類是部分類,那麼您正在外部討論類。

編輯:像你想要我寫了下面

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; 
} 

*警告做一些事情,這種方法需要被想出來使用,我希望有一個更好的辦法做到這一點之前多。

+2

不需要通用約束 – shf301 2009-10-30 03:06:00

2

我想你可能正在尋找枚舉的擴展方法。 以下是一個起始鏈接:http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

+0

不是我在找什麼,更有興趣擴展Enum.SomeMethod()而不是MyCustomEnum.SomeMethod() – Joshscorp 2009-10-30 02:19:20

+0

http:// web.archive.org/web/20100916130304/http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx,因爲鏈接已關閉。 – dividius 2012-04-17 11:31:21

0

這是我能想到的最好的測試。請記住,枚舉可以基於64位整數:

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

還有一個例子。

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; 
    } 

和用法。

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