Niektóre inne bardziej prymitywne opcje, które unikają klas / typów referencji:
- Metoda tablicowa
- Zagnieżdżona metoda struct
Metoda tablicowa
private struct PublishStatusses
{
public static string[] Desc = {
"Not Completed",
"Completed",
"Error"
};
public enum Id
{
NotCompleted = 0,
Completed,
Error
};
}
Stosowanie
string desc = PublishStatusses.Desc[(int)PublishStatusses.Id.Completed];
Zagnieżdżona metoda struct
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";
}
}
Stosowanie
int id = PublishStatusses.NotCompleted.Id;
string desc = PublishStatusses.NotCompleted.Desc;
Aktualizacja (03/09/2018)
Hybrydowa metoda przedłużania i pierwsza technika powyżej.
Wolę, aby wyliczenia były definiowane tam, gdzie „należą” (najbliżej źródła pochodzenia, a nie w jakiejś wspólnej, globalnej przestrzeni nazw).
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)" };
}
}
}
Wydaje się, że metoda rozszerzenia pasuje do wspólnego obszaru, a „zlokalizowana” definicja wyliczenia sprawia, że metoda rozszerzenia jest bardziej szczegółowa.
namespace Common
{
public static class EnumExtensions
{
public static string Name(this RecordVM.Enum.Id id)
{
return RecordVM.Enum.Name[(int)id];
}
}
}
Przykład użycia wyliczenia i jego metody rozszerzenia.
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;
}
}
}
Uwaga: Właściwie postanowiłem wyeliminować Enum
opakowanie (i Name
tablicę), ponieważ najlepiej jest, aby ciągi nazw pochodziły z zasobu (tj. Pliku konfiguracyjnego lub DB), a nie były na stałe zakodowane, a ponieważ w końcu umieściłem metodę rozszerzenia w ViewModels
przestrzeń nazw (tylko w innym pliku „CommonVM.cs”). Ponadto cała .Id
sprawa staje się rozpraszająca i nieporęczna.
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;
}
}
}
}
Przykład użycia wyliczenia i jego metody rozszerzenia.
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;
}
}
}