375 Stimmen

Enum ToString mit benutzerfreundlichen Zeichenketten

Meine Aufzählung besteht aus den folgenden Werten:

private enum PublishStatusses{
    NotCompleted,
    Completed,
    Error
};

Ich möchte diese Werte jedoch in einer benutzerfreundlichen Weise ausgeben können.
Ich muss nicht in der Lage sein, von einer Zeichenfolge zu einem Wert zu wechseln.

452voto

Ray Booysen Punkte 26896

Ich benutze die Description Attribut aus dem Namespace System.ComponentModel. Dekorieren Sie einfach die Aufzählung:

private enum PublishStatusValue
{
    [Description("Not Completed")]
    NotCompleted,
    Completed,
    Error
};

Verwenden Sie dann diesen Code, um sie abzurufen:

public static string GetDescription<T>(this T enumerationValue)
    where T : struct
{
    Type type = enumerationValue.GetType();
    if (!type.IsEnum)
    {
        throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");
    }

    //Tries to find a DescriptionAttribute for a potential friendly name
    //for the enum
    MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
    if (memberInfo != null && memberInfo.Length > 0)
    {
        object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attrs != null && attrs.Length > 0)
        {
            //Pull out the description value
            return ((DescriptionAttribute)attrs[0]).Description;
        }
    }
    //If we have no description attribute, just return the ToString of the enum
    return enumerationValue.ToString();
}

437voto

Ich mache das mit Erweiterungsmethoden:

public enum ErrorLevel
{
  None,
  Low,
  High,
  SoylentGreen
}

public static class ErrorLevelExtensions
{
  public static string ToFriendlyString(this ErrorLevel me)
  {
    switch(me)
    {
      case ErrorLevel.None:
        return "Everything is OK";
      case ErrorLevel.Low:
        return "SNAFU, if you know what I mean.";
      case ErrorLevel.High:
        return "Reaching TARFU levels";
      case ErrorLevel.SoylentGreen:
        return "ITS PEOPLE!!!!";
      default:
        return "Get your damn dirty hands off me you FILTHY APE!";
    }
  }
}

100voto

annakata Punkte 72408

Vielleicht übersehe ich etwas, aber was ist falsch mit Enum.GetName?

public string GetName(PublishStatusses value)
{
    return Enum.GetName(typeof(PublishStatusses), value)
}

edit: für benutzerfreundliche Strings muss man über eine .resource gehen, um die Internationalisierung/Lokalisierung zu erreichen, und es wäre wohl besser, einen festen Schlüssel zu verwenden, der auf dem Enum-Schlüssel basiert, als ein Decorator-Attribut für denselben.

29voto

Brian Richardson Punkte 520

Ich habe eine umgekehrte Erweiterungsmethode erstellt, um die Beschreibung wieder in einen Enum-Wert zu konvertieren:

public static T ToEnumValue<T>(this string enumerationDescription) where T : struct
{
    var type = typeof(T);

    if (!type.IsEnum)
        throw new ArgumentException("ToEnumValue<T>(): Must be of enum type", "T");

    foreach (object val in System.Enum.GetValues(type))
        if (val.GetDescription<T>() == enumerationDescription)
            return (T)val;

    throw new ArgumentException("ToEnumValue<T>(): Invalid description for enum " + type.Name, "enumerationDescription");
}

20voto

Noldorin Punkte 138548

Die einfachste Lösung ist hier die Verwendung einer benutzerdefinierten Erweiterungsmethode (zumindest in .NET 3.5 - für frühere Framework-Versionen können Sie sie einfach in eine statische Hilfsmethode umwandeln).

public static string ToCustomString(this PublishStatusses value)
{
    switch(value)
    {
        // Return string depending on value.
    }
    return null;
}

Ich gehe hier davon aus, dass Sie etwas anderes als den tatsächlichen Namen des Enum-Werts zurückgeben möchten (den Sie durch den einfachen Aufruf von ToString erhalten können).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X