Một số tùy chọn nguyên thủy khác tránh các lớp / kiểu tham chiếu:
- Phương thức mảng
- Phương pháp cấu trúc lồng nhau
Phương thức mảng
private struct PublishStatusses
{
public static string[] Desc = {
"Not Completed",
"Completed",
"Error"
};
public enum Id
{
NotCompleted = 0,
Completed,
Error
};
}
Sử dụng
string desc = PublishStatusses.Desc[(int)PublishStatusses.Id.Completed];
Phương pháp cấu trúc lồng nhau
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";
}
}
Sử dụng
int id = PublishStatusses.NotCompleted.Id;
string desc = PublishStatusses.NotCompleted.Desc;
Cập nhật (03/09/2018)
Một sự kết hợp của Phương pháp mở rộng và kỹ thuật đầu tiên ở trên.
Tôi thích enum được xác định nơi chúng "thuộc về" (gần nhất với nguồn gốc của chúng chứ không phải trong một số không gian tên chung, chung).
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)" };
}
}
}
Phương thức mở rộng có vẻ phù hợp với một khu vực chung và định nghĩa "cục bộ hóa" của enum hiện làm cho phương thức mở rộng dài dòng hơn.
namespace Common
{
public static class EnumExtensions
{
public static string Name(this RecordVM.Enum.Id id)
{
return RecordVM.Enum.Name[(int)id];
}
}
}
Một ví dụ sử dụng của enum và phương thức mở rộng của nó.
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;
}
}
}
Lưu ý: Tôi thực sự đã quyết định loại bỏ Enum
trình bao bọc (và Name
mảng), vì tốt nhất là các chuỗi tên đến từ một tài nguyên (ví dụ: tệp cấu hình hoặc DB) thay vì được mã hóa cứng và vì cuối cùng tôi đã đưa phương thức mở rộng vào ViewModels
không gian tên (chỉ trong một tệp "CommonVM.cs" khác). Cộng với toàn bộ .Id
điều trở nên mất tập trung và cồng kềnh.
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;
}
}
}
}
Một ví dụ sử dụng của enum và phương thức mở rộng của nó.
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;
}
}
}