C#枚举中的方法


165

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

C#中是否存在这种可能性,或者仅仅是字符串集合而已?

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


我认为您不能在C#的Enum中拥有方法。你想做什么?
邓肯·豪

试图获得Java行为并封装与Enums紧密的逻辑。无论如何,我从答案中看到这是不可能的-我将实现扩展。
Eya

Answers:


272

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

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


11

另一个选择是使用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

不。您可以创建一个类,然后向该类添加一堆属性以某种程度上模拟枚举,但这并不是一回事

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


0

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

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

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


-15

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

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


7
七票否决,没有任何评论,以解释这个答案应该有什么问题?来吧家伙...
晚安书呆子骄傲

这篇文章中提供的所有信息是否错误?
VK

5
这部分是正确的:C#不允许在枚举器中使用方法。不过,我不确定推理是否正确,第二段似乎与该问题完全无关。如果有一种方法可以使用结构来模拟具有行为的枚举,则最好提供一个示例。
Mishelle '16

3
我认为这里的含义很清楚。不要仅仅为了添加方法而用类(引用类型)替换枚举(值类型),因为结构体也可以具有方法并且也是值类型。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.