在Java中,枚举类型可以包含方法。
在C#中是否也有类似的功能,还是只能用字符串集合来实现?
我尝试重写 ToString()
方法,但编译失败了。有没有简单的代码示例可以提供?
在Java中,枚举类型可以包含方法。
在C#中是否也有类似的功能,还是只能用字符串集合来实现?
我尝试重写 ToString()
方法,但编译失败了。有没有简单的代码示例可以提供?
你可以为枚举类型编写扩展方法:
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();
}
}
另一个选择是使用由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)非常接近。
不行。你可以创建一个类,然后向该类添加一堆属性来“有点像”枚举,但这并不是真正的枚举。
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.
}
}
自从我遇到并需要与枚举相反的字符串,这里提供了一种通用解决方案:
static class EnumExtensions {
public static T GetEnum<T>(this string itemName) {
return (T) Enum.Parse(typeof(T), itemName, true);
}
}
C# 不允许在枚举器中使用方法,因为它不是基于类的原则,而是一个带有字符串和值的二维数组。
在这种情况下,Microsoft 强烈不建议使用类,而应该使用(数据)结构;STRUCT 旨在作为数据及其处理程序的轻量级类,并且可以很好地处理函数。C# 及其编译器没有像 JAVA 那样的跟踪和效率能力,其中某个类/方法被使用的次数越多,它运行得越快,其使用变得“预期”。C# 简单地没有这个功能,因此为了区分,应该使用 STRUCT 而不是 CLASS。