C#中枚举内的方法

221

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

在C#中是否也有类似的功能,还是只能用字符串集合来实现?

我尝试重写 ToString() 方法,但编译失败了。有没有简单的代码示例可以提供?


我认为在C#中枚举类型内部不能有方法。你想做什么? - Duncan Howe
尝试获取Java行为并将关闭逻辑封装到枚举中。无论如何,从答案中我看到这是不可能的 - 我将实现扩展。 - Eya
6个回答

358

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

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

22

15

另一个选择是使用由Jimmy Bogard创建的枚举类

基本上,您必须创建一个从他的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下载它。

尽管这个实现不是原生的,但语法(构造和使用)与一些更好地实现枚举的语言(例如Kotlin)非常接近。


这样做的缺点是枚举值不再被视为常量。 - Dave Cousineau
这样做的一个缺点是枚举值不再被视为常量。 - Dave Cousineau

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

这个的扩展实际上是一个很好的做法:不要让属性返回字符串,而是可以返回一个存储文本值的 MyClass 实例。实际上,这与 Java 的枚举等效。建议使用枚举类 - 例如您提出的一些调整 - 而不是 C# 枚举类型。 - TheAgent

1

自从我遇到并需要与枚举相反的字符串,这里提供了一种通用解决方案:

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

这也忽略了大小写,非常适用于解析REST响应以获取更多的类型安全性。希望对某些人有所帮助。

-9

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

在这种情况下,Microsoft 强烈不建议使用类,而应该使用(数据)结构;STRUCT 旨在作为数据及其处理程序的轻量级类,并且可以很好地处理函数。C# 及其编译器没有像 JAVA 那样的跟踪和效率能力,其中某个类/方法被使用的次数越多,它运行得越快,其使用变得“预期”。C# 简单地没有这个功能,因此为了区分,应该使用 STRUCT 而不是 CLASS。


19
这个回答收到七个负投票,却没有一个评论来解释哪里出了问题?拜托大家…… - Good Night Nerd Pride
1
这篇帖子中提供的所有信息都是错误的吗? - V K
8
这部分是正确的:C# 不允许在枚举器中使用方法。虽然我不确定推理是否正确,第二段似乎与问题完全无关。如果有一种使用结构体来模拟带有行为的枚举的方法,请提供一个示例最好。 - Mishelle
5
这里的含义相当明显。不要仅仅为了添加方法而将枚举(一种值类型)替换为类(一种引用类型),因为结构体也可以有方法,并且同样是值类型。 - smelch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接