来自string,int等的枚举

Lou*_*hys 26 .net c# extension-methods enums type-conversion

使用扩展方法,我们可以创建方法通过创建扩展方法来枚举转换为其它数据类型(如String),INT ToInt(),ToString()等的枚举.

我想知道如何实现其他方式,例如FromInt(int),FromString(string)等等.据我所知,我无法创建MyEnum.FromInt()(静态)扩展方法.那么有什么可能的方法呢?

Jam*_*iec 34

我会避免使用枚举的扩展方法来污染int或字符串,而是一个好的老式静态助手类可能是有序的.

public static class EnumHelper
{
   public static T FromInt<T>(int value)
   {
       return (T)value;
   }

  public static T FromString<T>(string value)
  {
     return (T) Enum.Parse(typeof(T),value);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • `FromInt`不能为我编译,_Cannot将类型'int'转换为'T'_? (4认同)
  • 我什至没有调用它,并且编译失败-我改为使用它:`public static T ToEnum &lt;T&gt;(此int值){return(T)Enum.Parse(typeof(T),value.ToString() ); }` (2认同)

Luk*_*keH 21

你真的需要那些扩展方法吗?

MyEnum fromInt = (MyEnum)someIntValue;
MyEnum fromString = (MyEnum)Enum.Parse(typeof(MyEnum), someStringValue, true);

int intFromEnum = (int)MyEnum.SomeValue;
string stringFromEnum = MyEnum.SomeValue.ToString();
Run Code Online (Sandbox Code Playgroud)


Max*_*dov 7

反过来可能是......反过来;)使用泛型扩展方法扩展int和string ,它将枚举类型作为类型参数:

public static TEnum ToEnum<TEnum>(this int val)
{
    return (TEnum) System.Enum.ToObject(typeof(TEnum), val);
}
Run Code Online (Sandbox Code Playgroud)
public static TEnum ToEnum<TEnum>(this string val)
{
    return (TEnum) System.Enum.Parse(typeof(TEnum), val);
}
Run Code Online (Sandbox Code Playgroud)

用法:

var redFromInt = 141.ToEnum<System.Drawing.KnownColor>();
var redFromString = "Red".ToEnum<System.Drawing.KnownColor>();
Run Code Online (Sandbox Code Playgroud)

遗憾的是,Enums没有通用约束,因此我们必须在运行时检查TEnum类型; 为了简化我们将验证Enum.ToObjectEnum.Parse方法.