枚举扩展方法
在vs2008中,是否可以编写适用于任何枚举的扩展方法。
我知道你可以针对特定的枚举编写扩展方法,但我希望能够使用单个扩展方法进行每个枚举。 这可能吗?
是的,只是针对基类Enum
types的代码,例如
public static void Something(this Enum e) { // code here }
Enum.GetUnderlyingType
的一面是,你可能最终会做一些非常讨厌的东西,比如使用Enum.GetUnderlyingType
,根据枚举的基types来Enum.GetUnderlyingType
使用不同的分支,但是你可以find一些它的好用途(例如,我们有适用于所有枚举的IsOneOf
和IsCombinationOf
方法)。
PS:在写这个方法的时候,请记住,虽然不好意思,你可以使用float
和double
作为枚举的基types,所以你需要一些特殊的情况以及无符号的值。
是的你可以。 目标扩展types是Enum
types。 在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();