在Java中,可以在枚举中包含方法。
在C#中是否存在这样的可能性,或者它只是一个字符串集合而且就是这样吗?
我试图覆盖ToString()
,但它没有编译。有人有简单的代码示例吗?
答案 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。