在Java中,可以在枚举中包含方法。

c#中有这样的可能性吗?或者它只是一个字符串集合,仅此而已?

我试图覆盖ToString(),但它不编译。有人有简单的代码示例吗?


当前回答

你可以为枚举类型编写扩展方法:

enum Stuff
{
    Thing1,
    Thing2
}

static class StuffMethods
{

    public static String GetString(this Stuff s1)
    {
        switch (s1)
        {
            case Stuff.Thing1:
                return "Yeah!";
            case Stuff.Thing2:
                return "Okay!";
            default:
                return "What?!";
        }
    }
}

class Program
{


    static void Main(string[] args)
    {
        Stuff thing = Stuff.Thing1;
        String str = thing.GetString();
    }
}

其他回答

你可以为你的枚举写一个扩展方法:

如何:为枚举创建新方法(c#编程指南)

没有。你可以创建一个类,然后向类中添加一堆属性来模拟枚举,但这并不是一回事。

class MyClass
{
    public string MyString1 { get{ return "one";} }
    public string MyString2 { get{ return "two";} }
    public string MyString3 { get{ return "three";} }

    public void MyMethod()
    {
        // do something.
    }
}

更好的模式是将方法放在与emum分开的类中。

c#不允许在枚举器中使用方法,因为它不是基于类的原则,而是一个包含字符串和值的二维数组。

在这种情况下,Microsoft非常不鼓励使用类,而是使用(data)结构体(ures);STRUCT的目的是作为数据及其处理程序的轻类,可以很好地处理函数。c#和它的编译器没有像JAVA那样的跟踪和效率能力,在JAVA中,某个类/方法使用的次数越多,运行的速度就越快,它的使用就变得“预期”。c#没有这样的功能,所以要进行区分,请使用STRUCT而不是CLASS。

因为我遇到了,需要enum string的完全相反的情况,这里是一个通用的解决方案:

static class EnumExtensions {
    public static T GetEnum<T>(this string itemName) {
        return (T) Enum.Parse(typeof(T), itemName, true);
    }
}

这也忽略了大小写,对于解析REST-Response到枚举以获得更多类型安全非常方便。 希望它能帮助到别人

另一种选择是使用Jimmy Bogard创建的枚举类。

基本上,您必须创建一个继承自他的枚举的类。例子:

public class EmployeeType : Enumeration
{
    public static readonly EmployeeType Manager 
        = new EmployeeType(0, "Manager");
    public static readonly EmployeeType Servant 
        = new EmployeeType(1, "Servant");
    public static readonly EmployeeType Assistant
        = new EmployeeType(2, "Assistant to the Regional Manager");

    private EmployeeType() { }
    private EmployeeType(int value, string displayName) : base(value, displayName) { }

    // Your method...
    public override string ToString()
    {
        return $"{value} - {displayName}!";
    }
}

然后你可以像使用枚举一样使用它,并可以在其中放入方法(以及其他事情):

EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager

你可以用NuGet下载它。

尽管这种实现在该语言中不是原生的,但其语法(结构和用法)非常接近于比c#更好地原生实现枚举的语言(例如Kotlin)。