当前位置:  开发笔记 > 编程语言 > 正文

枚举扩展方法

如何解决《枚举扩展方法》经验,为你挑选了4个好方法。

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

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



1> Greg Beech..:

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

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

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

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


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

2> Scott Dorman..:

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

public static void EnumExtension(this Enum e)
{
}

或者在VB中这样:

 _
Public Sub EnumExtension(ByVal s As Enum)
End Sub



3> Michael La V..:

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

public static class ExtensionMethods
{
    public static bool TryParse(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 for Enums

枚举的扩展方法


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

4> Adriaan de B..:

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

public static class ExtensionMethods 
{
    public static void ForEach(this Enum enumType, Action 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); 
} 

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有