在C#中扩展枚举

我想知道我是否可以延长枚举类型在C#来实现我的自定义Enum.GetValues​​(型),并调用它像Enum.GetMyCustomValues​​(类型)

我想实现这样的事情:

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) 但是,这仍然只是创建枚举实例创建方法。 只有这样,才能添加静态方法,如你在谈论外部一类是如果类是部分类。

编辑:做这样的事情,你要我写了下面的

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

*警告,这种方法需要进行深思熟虑的使用,我希望有一个更好的办法做到这一点更前。

我想你可能会寻找一个枚举扩展方法。 这里有一个起点链接:http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

还有一例子。

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

下面是测试最好的,我能想到的。 请记住,枚举可以基于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;
}

分类:C# 时间:2012-01-01 人气:2
分享到:

相关文章

  • 在一个枚举IEnumerable的扩展方法 2012-02-03

    我有(如下图),我希望能够在使用LINQ扩展方法枚举. enum Suit{ Hearts = 0, Diamonds = 1, Clubs = 2, Spades = 3 } Enum.GetValues​​(...)是返回类型System.Array的,但我似乎无法获得访问了ToList()扩展或其他任何形式的. 我只是希望写的东西像... foreach(Suit s in Enum.GetValues(typeof(Suit)).Select(x=>x).Where(x=> x !=

  • 对于增值位域扩展方法(标志枚举) 2013-04-20

    与其这样做是为了一个增值的标志枚举变量: MyFlags flags = MyFlags.Pepsi; flags = flags | MyFlags.Coke; 我想创建一个扩展的方法来实现这一目标: MyFlags flags = MyFlags.Pepsi; flags.Add(MyFlags.Coke); 可能? 你是怎么做到的呢? --------------解决方案------------- 不以任何有用的方式. 枚举是值类型,所以使得扩展方法枚举的副本将获得通过的时候,这意味着你需

  • 在Silverlight中定义的扩展方法的枚举 2012-01-26

    Silverlight是缺少对GetValues​​方法枚举,所以我想我会写一个扩展方法,以弥补我的项目我的需要. 唯一的一点是,林不知道的扩展方法的签名应该是什么样子. 即时通讯思想沿线的东西: public static IEnumerable<Enum> GetValues(this Enum e) 但它没有出现在智能感知,所以我知道我错了. 任何指针? --------------解决方案------------- 我想我理解了它通过将一点点反思与和挖掘在反射器: public sta

  • 帮助与枚举扩展方法 2012-07-18

    我有enum帮手泛型类在那里我有方法EnumDescription()要调用它,我必须去这样EnumHelper<Enumtype>.EnumDescription(value)我想要实现enum扩展方法EnumDescription(this Enum value)这基于我的枚举帮手方法EnumHelper<T>.EnumDescription(value) 有一件事我坚持. 下面是我的代码: public static string EnumDescription(this E

  • C#扩展方法来检查一个枚举有一个标志设置 2012-08-17

    我想打一个扩展的方法来检查,如果枚举有一个标志. DaysOfWeek workDays = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday; // instead of this: if ((workDays & DaysOfWeek.Monday) == DaysOfWeek.Monday) ... // I want this: if (workDays.ContainsFlag(DaysOfWeek.Monday

  • 通用扩展方法,看看是否枚举包含一个标志 2012-11-30

    考虑到这一点: [Flags] public enum MyEnum { One = 1, Two = 2, Four = 4, Eight = 8 } public static class FlagsHelper { public static bool Contains(this MyEnum keys, MyEnum flag) { return (keys & flag) != 0; } } 是否可以写一个通用版本,包含将适用于任何enum ,而不仅仅是MyEnum 编辑: 这将是我的

  • 是一个扩展方法将函数添加到一个枚举的唯一途径? 2013-02-20

    我有一个方向枚举: Public Enum Direction Left Right Top Bottom End Enum 有时我需要得到的倒数,所以它看上去不错写的: SomeDirection.Inverse() 但我不能把方法上枚举! 不过,我可以添加一个扩展方法 (VS2008 +),以它. 在VB中,扩展方法必须是内部模块 . 我真的不喜欢的模块多,而且我想写一个(中等)简单的类,我可以在一个单一的文件共享被插入到其它项目. 模块只能驻留在文件/命名空间的水平,所以我有一个在文件中,

  • 枚举位域扩展方法,返回包含值的字典 2013-03-02

    枚举可以肯定会造成混乱. 我想创建的枚举类型,将采取一个值,并返回所有匹配的比特的名字扩展方法. 鉴于: [Flags] public enum PlanetsEnum { Mercury=1, Venus=2, Earth=4, Mars=8, Jupiter=16, //etc.... } 我想创建一个仅返回选定的值的词典扩展方法. 因此,如果: PlanetsEnum neighbors = PlanetsEnum.Mars | PlanetEnum.Venus; //10 IDictio

  • 枚举扩展方法来清除就地 2013-11-09

    我有一个枚举,假设它被称为运动: enum Sports { Baseball = 1, Basketball = 2, Football = 4, Hockey = 8, Soccer = 16, Tennis = 32, etc... } 我基本上是想补充一点清除面具有点像这样的扩展方法: Sports Mask = Sports.Baseball | Sports.Football | Sports.Tennis; //37 Mask.Clear(Sports.Baseball); //

  • 从类型枚举,并调用扩展方法 2013-11-12

    static void Main(string[] args) { List<string> tests = new List<string>() { "TypeTester.NonExist", "TypeTester.Thing", "TypeTester.Fruit", "TypeTester.Color" }; PrintEnums(); foreach (var item in tests)

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.690 (s). 10 q(s)