扩展枚举在C#
问题描述:
我不知道我是否能在C#扩展枚举类型来实现我的自定义Enum.GetValues(型),并调用它像Enum.GetMyCustomValues(类型)扩展枚举在C#
我想实现是这样的:
public static bool IsFlagSet<T>(this T value, T flag) where T : Enum
{
return (value & flag) != (T)0;
}
,但它不能做...... 任何变通,我能做什么? 干杯
答
扩展插件适用于实例,不适用于创建静态方法。您可以使用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
答
我想你可能正在寻找枚举的扩展方法。 以下是一个起始链接:http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx
答
这是我能想到的最好的测试。请记住,枚举可以基于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;
}
答
还有一个例子。
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
http://*.com/questions/1415140/c-enums-can-my-enums-have-friendly-names – 2009-10-30 02:19:15
也许这? http://msdn.microsoft.com/en-us/library/bb383974.aspx – Asher 2011-02-04 08:56:35