Einige andere primitivere Optionen, die Klassen / Referenztypen vermeiden:
- Array-Methode
- Verschachtelte Strukturmethode
Array-Methode
private struct PublishStatusses
{
public static string[] Desc = {
"Not Completed",
"Completed",
"Error"
};
public enum Id
{
NotCompleted = 0,
Completed,
Error
};
}
Verwendung
string desc = PublishStatusses.Desc[(int)PublishStatusses.Id.Completed];
Verschachtelte Strukturmethode
private struct PublishStatusses
{
public struct NotCompleted
{
public const int Id = 0;
public const string Desc = "Not Completed";
}
public struct Completed
{
public const int Id = 1;
public const string Desc = "Completed";
}
public struct Error
{
public const int Id = 2;
public const string Desc = "Error";
}
}
Verwendung
int id = PublishStatusses.NotCompleted.Id;
string desc = PublishStatusses.NotCompleted.Desc;
Update (03/09/2018)
Eine Mischung aus Erweiterungsmethoden und der ersten Technik oben.
Ich bevorzuge es, Enums dort zu definieren, wo sie "hingehören" (am nächsten an ihrer Herkunftsquelle und nicht in einem gemeinsamen globalen Namespace).
namespace ViewModels
{
public class RecordVM
{
//public enum Enum { Minutes, Hours }
public struct Enum
{
public enum Id { Minutes, Hours }
public static string[] Name = { "Minute(s)", "Hour(s)" };
}
}
}
Die Erweiterungsmethode scheint für einen gemeinsamen Bereich geeignet zu sein, und die "lokalisierte" Definition der Aufzählung macht die Erweiterungsmethode jetzt ausführlicher.
namespace Common
{
public static class EnumExtensions
{
public static string Name(this RecordVM.Enum.Id id)
{
return RecordVM.Enum.Name[(int)id];
}
}
}
Ein Anwendungsbeispiel für die Aufzählung und ihre Erweiterungsmethode.
namespace Views
{
public class RecordView
{
private RecordDataFieldList<string, string> _fieldUnit;
public RecordView()
{
_fieldUnit.List = new IdValueList<string, string>
{
new ListItem<string>((int)RecordVM.Enum.Id.Minutes, RecordVM.Enum.Id.Minutes.Name()),
new ListItem<string>((int)RecordVM.Enum.Id.Hours, RecordVM.Enum.Id.Hours.Name())
};
}
private void Update()
{
RecordVM.Enum.Id eId = DetermineUnit();
_fieldUnit.Input.Text = _fieldUnit.List.SetSelected((int)eId).Value;
}
}
}
Hinweis: Ich habe mich tatsächlich dazu entschlossen, den Enum
Wrapper (und das Name
Array) zu entfernen, da es am besten ist, dass die Namenszeichenfolgen aus einer Ressource (z. B. Konfigurationsdatei oder Datenbank) stammen, anstatt fest codiert zu sein, und weil ich die Erweiterungsmethode in das Feld eingefügt habe ViewModels
Namespace (nur in einer anderen "CommonVM.cs" -Datei). Außerdem wird das Ganze .Id
ablenkend und umständlich.
namespace ViewModels
{
public class RecordVM
{
public enum Enum { Minutes, Hours }
//public struct Enum
//{
// public enum Id { Minutes, Hours }
// public static string[] Name = { "Minute(s)", "Hour(s)" };
//}
}
}
CommonVM.cs
//namespace Common
namespace ViewModels
{
public static class EnumExtensions
{
public static string Name(this RecordVM.Enum id)
{
//return RecordVM.Enum.Name[(int)id];
switch (id)
{
case RecordVM.Enum.Minutes: return "Minute(s)";
case RecordVM.Enum.Hours: return "Hour(s)";
default: return null;
}
}
}
}
Ein Anwendungsbeispiel für die Aufzählung und ihre Erweiterungsmethode.
namespace Views
{
public class RecordView
{
private RecordDataFieldList<string, string> _fieldUnit
public RecordView()
{
_fieldUnit.List = new IdValueList<string, string>
{
new ListItem<string>((int)RecordVM.Enum.Id.Minutes, RecordVM.Enum.Id.Minutes.Name()),
new ListItem<string>((int)RecordVM.Enum.Id.Hours, RecordVM.Enum.Id.Hours.Name())
};
}
private void Update()
{
RecordVM.Enum eId = DetermineUnit();
_fieldUnit.Input.Text = _fieldUnit.List.SetSelected((int)eId).Value;
}
}
}