来自string,int等的枚举
使用扩展方法,我们可以通过为枚举创建扩展方法ToInt()
, ToString()
等来创建将枚举转换为其他数据类型(如string,int)的方法。
我想知道如何实现其他方式,例如FromInt(int)
, FromString(string)
等。据我所知,我无法创建MyEnum.FromInt()
(静态)扩展方法。 那么可能的方法是什么?
我会避免使用枚举的扩展方法来污染int或字符串,而是可以按顺序使用一个好的老式静态助手类。
public static class EnumHelper { public static T FromInt(int value) { return (T)value; } public static T FromString (string value) { return (T) Enum.Parse(typeof(T),value); } }
你真的需要那些扩展方法吗?
MyEnum fromInt = (MyEnum)someIntValue; MyEnum fromString = (MyEnum)Enum.Parse(typeof(MyEnum), someStringValue, true); int intFromEnum = (int)MyEnum.SomeValue; string stringFromEnum = MyEnum.SomeValue.ToString();
反过来可能是……反过来;)使用generics扩展方法扩展int和string,它将枚举的类型作为类型参数:
public static TEnum ToEnum(this int val) { return (TEnum) System.Enum.ToObject(typeof(TEnum), val); }
public static TEnum ToEnum(this string val) { return (TEnum) System.Enum.Parse(typeof(TEnum), val); }
用法:
var redFromInt = 141.ToEnum(); var redFromString = "Red".ToEnum();
遗憾的是,Enums没有通用约束,因此我们必须在运行时检查TEnum类型; 为了简化,我们将validationEnum.ToObject
和Enum.Parse
方法。
为什么你想要FromInt一个扩展方法而不仅仅是投射它?
MyEnum fromInt; if(Enum.IsDefined(typeof(MyEnum), intvalue)) { fromInt = (MyEnum) intvalue; } else { //not valid }
或者,对于字符串,您可以使用Enum.TryParse
MyEnum fromString; if (Enum.TryParse(stringvalue, out fromString)) { //succeeded } else { //not valid }
另一种方法(对于问题的字符串部分):
/// /// Static class for generic parsing of string to enum /// /// Type of the enum to be parsed to public static class Enum { /// /// Parses the specified value from string to the given Enum type. /// /// The value. /// public static T Parse(string value) { //Null check if(value == null) throw new ArgumentNullException("value"); //Empty string check value = value.Trim(); if(value.Length == 0) throw new ArgumentException("Must specify valid information for parsing in the string", "value"); //Not enum check Type t = typeof(T); if(!t.IsEnum) throw new ArgumentException("Type provided must be an Enum", "T"); return (T)Enum.Parse(typeof(T), value); } }
(部分灵感来自: http : //devlicious.com/blogs/christopher_bennage/archive/2007/09/13/my-new-little-friend-enum-lt-t-gt.aspx )
你可以做:
public static class EnumExtensions { public static Enum FromInt32(this Enum obj, Int32 value) { return (Enum)((Object)(value)); } public static Enum FromString(this Enum obj, String value) { return (Enum)Enum.Parse(obj.GetType(), value); } }
要么:
public static class Int32Extensions { public static Enum ToEnum(this Int32 obj) { return (Enum)((Object)(obj)); } } public static class StringExtensions { public static Enum ToEnum(this Enum obj, String value) { return (Enum)Enum.Parse(obj.GetType(), value); } }
您可以在int和string上创建扩展方法。
或者在其他静态类上创建静态方法。 也许像EnumHelper.FromInt(int)之类的东西。
但我会提出一个问题:为什么要转换为字符串或int? 它不是你如何使用枚举,除了序列化。 但这应该由某种基础设施来处理,而不是你自己的代码。