枚举扩展方法

在vs2008中,是否可以编写适用于任何枚举的扩展方法。

我知道你可以针对特定的枚举编写扩展方法,但我希望能够使用单个扩展方法进行每个枚举。 这可能吗?

是的,只是针对基类Enumtypes的代码,例如

 public static void Something(this Enum e) { // code here } 

Enum.GetUnderlyingType的一面是,你可能最终会做一些非常讨厌的东西,比如使用Enum.GetUnderlyingType ,根据枚举的基types来Enum.GetUnderlyingType使用不同的分支,但是你可以find一些它的好用途(例如,我们有适用于所有枚举的IsOneOfIsCombinationOf方法)。

PS:在写这个方法的时候,请记住,虽然不好意思,你可以使用floatdouble作为枚举的基types,所以你需要一些特殊的情况以及无符号的值。

是的你可以。 目标扩展types是Enumtypes。 在C#中,这可以这样来完成:

 public static void EnumExtension(this Enum e) { } 

或者像这样在VB中:

 <Extension()> _ Public Sub EnumExtension(ByVal s As Enum) End Sub 

仅供参考这是我已经能够使用的Enum扩展方法的一个很好的例子。 它为枚举实现了不区分大小写的TryParse()函数:

 public static class ExtensionMethods { public static bool TryParse<T>(this Enum theEnum, string strType, out T result) { string strTypeFixed = strType.Replace(' ', '_'); if (Enum.IsDefined(typeof(T), strTypeFixed)) { result = (T)Enum.Parse(typeof(T), strTypeFixed, true); return true; } else { foreach (string value in Enum.GetNames(typeof(T))) { if (value.Equals(strTypeFixed, StringComparison.OrdinalIgnoreCase)) { result = (T)Enum.Parse(typeof(T), value); return true; } } result = default(T); return false; } } } 

您可以按照以下方式使用它:

 public enum TestEnum { A, B, C } public void TestMethod(string StringOfEnum) { TestEnum myEnum; myEnum.TryParse(StringOfEnum, out myEnum); } 

以下是我访问过的两个网站,以帮助您提供此代码:

不区分大小写的TryParse用于枚举

Enums的扩展方法

这里是另一个例子 – 也是更好的恕我直言,而不是创build和初始化临时variables。

 public static class ExtensionMethods { public static void ForEach(this Enum enumType, Action<Enum> action) { foreach (var type in Enum.GetValues(enumType.GetType())) { action((Enum)type); } } } public enum TestEnum { A,B,C } public void TestMethod() { default(TestEnum).ForEach(Console.WriteLine); } 

您也可以按如下方式实现转换方法:

 public static class Extensions { public static ConvertType Convert<ConvertType>(this Enum e) { object o = null; Type type = typeof(ConvertType); if (type == typeof(int)) { o = Convert.ToInt32(e); } else if (type == typeof(long)) { o = Convert.ToInt64(e); } else if (type == typeof(short)) { o = Convert.ToInt16(e); } else { o = Convert.ToString(e); } return (ConvertType)o; } } 

以下是一个示例用法:

 int a = MyEnum.A.Convert<int>(); 

有时需要根据枚举的名称或值,从一个枚举转换为另一个枚举。 以下是如何用扩展方法很好地完成的:

 enum Enum1 { One = 1, Two = 2, Three = 3 }; enum Enum2 { Due = 2, Uno = 1 }; enum Enum3 { Two, One }; Enum2 e2 = Enum1.One.ConvertByValue<Enum2>(); Enum3 e3 = Enum1.One.ConvertByName<Enum3>(); Enum3 x2 = Enum1.Three.ConvertByValue<Enum3>(); public static class EnumConversionExtensions { public static T ConvertByName<T>(this Enum value) { return (T)Enum.Parse(typeof(T), Enum.GetName(value.GetType(), value)); } public static T ConvertByValue<T>(this Enum value) { return (T)((dynamic)((int)((object)value))); } } 

另一个使Enum扩展的例子 – 但这次它返回input枚举types。

 public static IEnumerable<T> toElementsCollection<T>(this T value) where T : struct, IConvertible { if (typeof(T).IsEnum == false) throw new Exception("typeof(T).IsEnum == false"); return Enum.GetValues(typeof(T)).Cast<T>(); } 

使用示例:

 public enum TestEnum { A,B,C }; TestEnum.A.toElementsCollection();