在Java中,可以在枚举中包含方法。
c#中有这样的可能性吗?或者它只是一个字符串集合,仅此而已?
我试图覆盖ToString(),但它没有编译。有人有简单的代码示例吗?
ToString()
没有。你可以创建一个类,然后向类中添加一堆属性来有些模拟枚举,但那是其实不是一回事。
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#编程指南)
你可以为枚举类型编写扩展方法:
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#不允许在枚举器中使用方法,因为它不是基于类的原则,而是一个包含字符串和值的二维数组。
在这种情况下,Microsoft非常不鼓励使用类,而是使用(data)结构体(ures);STRUCT的目的是作为数据及其处理程序的轻类,可以很好地处理函数。c#和它的编译器没有像JAVA那样的跟踪和效率能力,在JAVA中,某个类/方法使用的次数越多,运行的速度就越快,它的使用就变得“预期”。c#没有这样的功能,所以要进行区分,请使用STRUCT而不是CLASS。
另一个选项是使用由吉米伯加德创建的枚举类。
基本上,你必须创建一个继承自他的Enumeration的类。例子:
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#更好的原生实现枚举的语言(例如芬兰湾的科特林)。
因为我遇到了,需要enum string的完全相反的情况,这里是一个通用的解决方案:
static class EnumExtensions { public static T GetEnum<T>(this string itemName) { return (T) Enum.Parse(typeof(T), itemName, true); } }