枚举扩展方法

Eri*_*ins 54 .net extension-methods enums enumeration

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

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

Gre*_*ech 81

是的,只是针对基本Enum类型的代码,例如

public static void Something(this Enum e)
{
    // code here
}
Run Code Online (Sandbox Code Playgroud)

从低端Enum.GetUnderlyingType来看,你最终可能会做一些非常讨厌的事情,例如根据枚举的基本类型找到真正的基类型,使用,转换和下降不同的分支,但你可以找到一些很好的用途它(例如我们有IsOneOfIsCombinationOf适用于所有枚举的方法).

PS:请记住,在编写方法的时候,尽管不明智,但您可以使用floatdouble作为枚举的基本类型,因此您需要一些特殊情况以及无符号值.

  • @Greg:用哪种语言可以使用float和double作为枚举的基础类型?你不能在C#中 - 你得到错误CS1008:输入byte,sbyte,short,ushort,int,uint,long或ulong expected (4认同)
  • 我所知道的唯一支持它的语言是CIL.我实际上没有尝试过证明这一点,因为它似乎是一个普遍的坏主意,但请看看Rico的评论在底部附近:http://en.csharp-online.net/.NET_Type_Design_Guidelines%E2%80%94Enum_Design (3认同)

Sco*_*man 18

是的你可以.目标扩展类型是类型Enum.在C#中,这将完成为:

public static void EnumExtension(this Enum e)
{
}
Run Code Online (Sandbox Code Playgroud)

或者在VB中这样:

<Extension()> _
Public Sub EnumExtension(ByVal s As Enum)
End Sub
Run Code Online (Sandbox Code Playgroud)


Mic*_*oie 18

仅供参考这是我能够使用的Enum Extension方法的一个很好的例子.它为枚举实现了一个不区分大小写的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式使用它:

public enum TestEnum
{
    A,
    B,
    C
}

public void TestMethod(string StringOfEnum)
{
    TestEnum myEnum;
    myEnum.TryParse(StringOfEnum, out myEnum);
}
Run Code Online (Sandbox Code Playgroud)

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

案例不敏感的TryParse for Enums

枚举的扩展方法

  • 就像脚注一样,从.net 4开始,Enum.TryParse需要重载以指定区分大小写:http://msdn.microsoft.com/en-us/library/dd991317%28v=vs.100%29.aspx (8认同)

Adr*_*eer 9

这是另一个例子 - 也比不得不创建和初始化临时变量更好的恕我直言.

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); 
} 
Run Code Online (Sandbox Code Playgroud)