我想知道我是否可以在C#中扩展Enum类型以实现我的自定义Enum.GetValues(类型)并将其称为Enum.GetMyCustomValues(type)
我正在尝试实现这样的事情:
public static bool IsFlagSet<T>(this T value, T flag) where T : Enum
{
return (value & flag) != (T)0;
}
但是无法做到...... 我可以做任何工作吗? 干杯
答案 0 :(得分:4)
Extensions适用于实例,而不适用于创建静态方法。您可以使用public static void MyExtensions(this Enum value)
扩展基本枚举。但是这仍然只会在您创建的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;
}
*警告,这个方法在使用之前需要更多考虑,我希望有更好的方法来做到这一点。
答案 1 :(得分:2)
我认为您可能正在寻找枚举的扩展方法。 这是一个起始链接: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx
答案 2 :(得分: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
答案 3 :(得分: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;
}