C#中的枚举方法

时间:2011-05-12 23:24:15

标签: c# enums enumeration

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

在C#中是否存在这样的可能性,或者它只是一个字符串集合而且就是这样吗?

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

6 个答案:

答案 0 :(得分:214)

您可以为枚举类型编写extension methods

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();
    }
}

答案 1 :(得分:18)

答案 2 :(得分:8)

另一种选择是使用 Jimmy Bogard 创建的Enumeration Class

基本上,您必须创建一个继承自Enumeration的类。例如:

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)实现枚举的语言。

答案 3 :(得分:3)

不。你可以创建一个类,然后在类中添加一堆属性,以稍微模拟枚举,但那不是真的相同

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分开的类中。

答案 4 :(得分:0)

由于我遇到过,并且需要枚举与字符串完全相反,所以这里是一个通用解决方案:

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

这也忽略大小写,对于解析对您的枚举的REST-Response以获取更多类型安全性非常方便。 希望它能对某人有所帮助

答案 5 :(得分:-10)

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

在这种情况下,Microsoft强烈建议不要使用类,而是使用(data)struct(ures); STRUCT旨在作为数据及其处理程序的轻量级,并且可以很好地处理函数。 C#及其编译器没有JAVA所知的跟踪和效率功能,其中使用某个类/方法的次数越多,运行得越快,其使用就越“预期”。 C#根本就没有,所以为了区分,使用STRUCT而不是CLASS。