【问题标题】:Methods inside enum in C#C#中枚举中的方法
【发布时间】:2011-08-24 13:07:59
【问题描述】:

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

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

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

【问题讨论】:

  • 我不认为你可以在 C# 的枚举中拥有方法。你想做什么?
  • 试图获取 Java 行为并将关闭逻辑封装到 Enums。无论如何,我从答案中看到这是不可能的 - 我将实施扩展。

标签: c# enums enumeration


【解决方案1】:

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

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 的枚举。建议 enum 类(例如您对一些调整的建议)优于 C# enum 类型。
【解决方案2】:

你可以为你的枚举写一个扩展方法:

How to: Create a New Method for an Enumeration (C# Programming Guide)

【讨论】:

    【解决方案3】:

    你可以为枚举类型写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();
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      在这种情况下,Microsoft 强烈反对使用类,请改用 (data)struct(ures); STRUCT 旨在作为数据及其处理程序的轻量级,并且可以很好地处理函数。 C# 及其编译器不具备 JAVA 中所知道的跟踪和效率功能,其中使用某个类/方法的次数越多,它运行的速度就越快,并且它的使用变得“预期”。 C# 根本没有,所以为了区分,使用 STRUCT 而不是 CLASS。

      【讨论】:

      • 七票否决,没有一条评论来解释这个答案应该有什么问题?来吧伙计们...
      • 这篇文章提供的所有信息都错了吗?
      • 这部分是真的:C# 不允许在枚举器中使用方法。我不确定推理是否正确,第二段似乎与问题完全无关。如果有办法使用结构来模拟具有行为的枚举,最好提供一个示例。
      • 我认为这里的含义相当清楚。不要仅仅为了添加方法而用类(引用类型)替换枚举(值类型),因为结构也可以有方法并且也是值类型。
      【解决方案5】:

      另一种选择是使用 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)。

      【讨论】:

        【解决方案6】:

        因为我遇到了,并且需要与枚举完全相反的字符串,所以这里有一个通用的解决方案:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-26
          • 1970-01-01
          • 2013-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多