【问题标题】:c# is it possible to override enum.ToString()? [duplicate]c# 是否可以覆盖 enum.ToString()? [复制]
【发布时间】:2022-01-20 15:52:19
【问题描述】:

我使用了一个名为AccessMode 的枚举并为它构建了一个函数:

 public static string ToString(this AccessMatrix.AccessMode am)
       {
           switch (am)
           {
               case AccessMatrix.AccessMode.Delete: return "Удалить";
               case AccessMatrix.AccessMode.Insert: return "Добавить";
               case AccessMatrix.AccessMode.Read: return "Прочитать";
               case AccessMatrix.AccessMode.Update: return "Обновить";
               case AccessMatrix.AccessMode.Grant: return "Передать права";
               case AccessMatrix.AccessMode.Unset: return "Не выбрано";
               default: throw new ArgumentException($"there's no such access mode");
           }
       }

但它为什么仍然使用默认的 ToString() 方法(并且不可能将 override 添加到函数中 - 它表示没有这样的函数可以覆盖)。我需要完全覆盖这个方法,因为我想用我的枚举覆盖默认的ToString() 行为,而不是为我使用这个方法——我将这个类添加到使用ToString() 显示元素名称的组合框(Windows 窗体)中。而且我认为不可能在不丢失价值的情况下更改 ComboBox 的文本。

我也尝试使用this method,但我不能使用switch,它说“预期的恒定值”。

是的,我不仅限于使用枚举。但是有最适合我的目的的类型。你能给我什么建议?如果 ToString() 无法覆盖枚举,你有什么建议?我需要:

  1. 我可以通过它的名称 (AccessMode.Name) 访问它
  2. 我可以轻松地将其转换为 int 并返回(嗯,我认为它适用于任何东西)
  3. 我可以重写它的 ToString() 方法
  4. 它是恒定的

目前,我正在使用枚举,通过我的 AccessMode.ToString 函数写入值并使用 string.ToAccessMode 将其取回,但感觉不对。有没有更好的办法?

【问题讨论】:

标签: c# winforms enums combobox tostring


【解决方案1】:

你应该像这样编写 ToString() 方法:

 public class AccessMatrix
{     
    public AccessMode accessMode { get; set; }
    public enum AccessMode
    {
        Delete,
        Insert,
        Read 
    }
    
    public string ToString(AccessMatrix.AccessMode am)
    {
        switch (am)
        {
            case AccessMatrix.AccessMode.Delete: return "Удалить";
            case AccessMatrix.AccessMode.Insert: return "Добавить";
            case AccessMatrix.AccessMode.Read: return "Прочитать";

            default: throw new ArgumentException($"there's no such access mode");
        }
    }
}

当你想使用这个时:

   AccessMatrix f = new AccessMatrix();
   f.accessMode = AccessMatrix.AccessMode.Delete;
   MessageBox.Show(f.ToString(f.accessMode));

我的结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2017-03-11
    • 2013-09-17
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多