Auf der Grundlage anderer Meinungen bin ich zu folgendem Ergebnis gekommen. Dieser Ansatz vermeidet die Eingabe von .Wert, wenn Sie den konstanten Wert erhalten möchten.
Ich habe eine Basisklasse für alle String-Enums wie diese:
using System;
using Newtonsoft.Json;
[JsonConverter(typeof(ConstantConverter))]
public class StringEnum: IConvertible
{
public string Value { get; set; }
protected StringEnum(string value)
{
Value = value;
}
public static implicit operator string(StringEnum c)
{
return c.Value;
}
public string ToString(IFormatProvider provider)
{
return Value;
}
public TypeCode GetTypeCode()
{
throw new NotImplementedException();
}
public bool ToBoolean(IFormatProvider provider)
{
throw new NotImplementedException();
}
//The same for all the rest of IConvertible methods
}
Der JsonConverter ist wie folgt aufgebaut:
using System;
using Newtonsoft.Json;
class ConstantConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
serializer.Serialize(writer, null);
}
else
{
serializer.Serialize(writer, value.ToString());
}
}
}
Und ein tatsächliches String-Enum wird etwa so aussehen:
public sealed class Colors : StringEnum
{
public static Colors Red { get { return new Catalog("Red"); } }
public static Colors Yellow { get { return new Catalog("Yellow"); } }
public static Colors White { get { return new Catalog("White"); } }
private Colors(string value) : base(value) { }
}
Und damit können Sie einfach Color.Red verwenden, um auch ohne die Value-Eigenschaft in Json zu serialisieren
1 Stimmen
Mögliche Duplikate von Enum ToString
24 Stimmen
Ich bin mir nicht sicher, warum die meisten Antworten nicht einfach "const string" verwenden und stattdessen eigene Klassen erstellen.
2 Stimmen
Sie können zwar keine Zeichenketten verwenden, aber Sie können sehr wohl Zeichenketten verwenden. Das ist eine Option, wenn Sie Werte mit nur einem Buchstaben verwenden können.
2 Stimmen
Ich bin wirklich verwirrt, warum die oben von CTS_AE vorgeschlagene Lösung nicht einmal unter den ersten drei Antworten ist.
0 Stimmen
@Sinjai Die explizite Gruppierung zusammengehöriger Werte wiegt den Nachteil eines unmerklichen Leistungsverlusts auf, insbesondere bei einer API oder einer wiederverwendbaren Komponente.
0 Stimmen
Ich bin verwirrt. Während das Erstellen einer benutzerdefinierten Klasse, wie in der vorgeschlagenen Antwort vorgeschlagen, funktioniert, bin ich der Meinung, dass eine
const string
scheint der eigentliche Kandidat für dieses Problem zu sein. Ich würde es einfach halten.6 Stimmen
@Sau001 / CTS_AE - wollte dies hier anbringen, da diese Kommentare ganz oben stehen und man ein wenig scrollen muss, um die Antwort zu finden. Siehe den Kommentar von Pharap zu dieser Antwort: stackoverflow.com/a/5674697/5948647 . Statische Klassen können nicht als Methodenparametertypen verwendet werden, so dass Sie die Verwendung einer Ihrer vordefinierten konstanten Zeichenketten in Methoden nicht erzwingen können.