【问题标题】:Change enum display更改枚举显示
【发布时间】:2013-06-21 03:55:45
【问题描述】:

我怎样才能有一个 c# 枚举,如果我选择字符串,它会返回一个不同的字符串,就像在 java 中它可以通过

public enum sample{
    some, other, things;

    public string toString(){
        switch(this){
          case some: return "you choose some";
          default: break;
        }
    }
}

Console.writeln(sample.some) 将输出:

you choose some

我只是希望我的枚举在我尝试调用它们时返回一个不同的字符串。

【问题讨论】:

  • 你尝试了什么?或者它在哪里失败了?
  • @Kangkan - 因为你不能从 C# 中的枚举派生,所以没有什么可以直接尝试...

标签: c# oop coding-style enums


【解决方案1】:

据我所知,这是不可能的。但是,您可以编写一个获取其他字符串的扩展方法:

public static class EnumExtensions
{
    public static string ToSampleString(this SampleEnum enum)
    {
         switch(enum)
         {
             case SampleEnum.Value1 : return "Foo";
             etc.
         }
    }
}

现在,只需在 SampleEnum 的实例上调用这个新的 ToSampleString

mySampleEnum.ToSampleString();

如果您对C# 中的扩展方法不熟悉,请阅读更多here

另一种选择是在每个enum 值上方使用Description 属性,如here 所述。

【讨论】:

  • 您可以结合使用枚举类的描述以及枚举值来生成定义一次的通用消息,并使用扩展方法将其组合在一起。将提供一种更可重用的扩展方法。 +1
  • 为什么检索Description属性这么复杂?
  • 获取描述属性只复杂一次。您将其添加为扩展方法,并且可用于所有 Enum,并且不再查看它。使用上面的答案,您必须为每个枚举创建一个这样的方法。您可以在这里查看一个很好的示例:weblogs.asp.net/stefansedich/archive/2008/03/12/…
  • 这真的,真的,真的不应该是公认的答案。使用属性是一种更优雅、面向对象的封装方式来解决这个问题。
【解决方案2】:

我会通过创建一个属性来装饰性地做到这一点,例如用它来描述和装饰枚举值。

例如

public enum Rate
{
   [Description("Flat Rate")]
   Flat,
   [Description("Time and Materials")]
   TM
}

然后使用GetCustomAttributes 读取/显示这些值。 http://msdn.microsoft.com/en-us/library/system.attribute.getcustomattributes.aspx

@CodeCamper 抱歉回复晚了,但这里有一些示例代码可以读取 DescriptionAttribute:

扩展方法:

public static class EnumExtensions
{
    public static string Description<T>(this T t)
    {
        var descriptionAttribute = (DescriptionAttribute) typeof (T).GetMember(t.ToString())
                                   .First().GetCustomAttribute(typeof (DescriptionAttribute));

        return descriptionAttribute == null ? "" : descriptionAttribute.Description;
    }
}

用法:

Rate currentRate = Rate.TM;
Console.WriteLine(currentRate.Description());

【讨论】:

  • 我一直在阅读有关如何执行此操作的文章,但由于某种原因,它似乎过于复杂。您能否展示最简单和最少行的代码来检索描述?
  • 感谢您的补充! +1
【解决方案3】:

你想要一本字典。枚举器枚举(给出一个数字)它的值。您希望在提供字符串键时返回字符串值。尝试类似:

Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("some", "you choose some");
dictionary.Add("other", "you choose other");
dictionary.Add("things", "you choose things");

然后这段代码:

string value = dictionary["some"];
Console.writeln(value);

将返回“你选择一些”

【讨论】:

    【解决方案4】:

    如果你只想获取 Enum 作为字符串,你可以使用这个方法:

    Enum.GetName(typeof(sample), value);
    

    此方法将返回 Enum 的名称而不是 int。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多