C# 在数据库字段中处理字母枚举代码
我在数据库中有一个字段(其模式我无法更改),其中包含一组特定的值。让我们称它们为C# 在数据库字段中处理字母枚举代码,c#,enums,datamodel,C#,Enums,Datamodel,我在数据库中有一个字段(其模式我无法更改),其中包含一组特定的值。让我们称它们为H,M,和LH代表高,M代表中,L代表低。在C#中,我希望能够以一种类型安全的方式引用这些值,但在代码中也是可读的 目前,存储库中到处都是这种模式: public static class Priority { public const string High = "H"; public const string Medium = "M"; public const string Low =
H
,M
,和L
H
代表高,M
代表中,L
代表低。在C#
中,我希望能够以一种类型安全的方式引用这些值,但在代码中也是可读的
目前,存储库中到处都是这种模式:
public static class Priority
{
public const string High = "H";
public const string Medium = "M";
public const string Low = "L";
}
它确实提供了可读性,但不是类型安全的,并且如果小写值进入数据库(不太可能,但并非不可能),则可能会有危险
有更好的方法来处理此模式吗?您可以将其实现为
枚举和静态类封装逻辑的组合,如下所示:
public enum Priority { High, Medium, Low }
public static class Priorities {
public static string GetCode(this Priority priority) {
switch (priority) {
case Priority.High: return "H";
case Priority.Medium: return "M";
case Priority.Low: return "L";
}
throw new ArgumentException("priority");
}
public static Priority GetPriority(string priorityCode) {
switch (priorityCode) {
case "H": return Priority.High;
case "M": return Priority.Medium;
case "L": return Priority.Low;
}
throw new ArgumentException("priorityCode");
}
}
现在,您可以使用Priorities.GetPriority(codeFromDatabase)
从DB代码中创建Priority
枚举元素,并调用
priority.GetCode()
要获取将优先级
写回数据库的代码。您可以将其实现为枚举
和静态类封装逻辑的组合,如下所示:
public enum Priority { High, Medium, Low }
public static class Priorities {
public static string GetCode(this Priority priority) {
switch (priority) {
case Priority.High: return "H";
case Priority.Medium: return "M";
case Priority.Low: return "L";
}
throw new ArgumentException("priority");
}
public static Priority GetPriority(string priorityCode) {
switch (priorityCode) {
case "H": return Priority.High;
case "M": return Priority.Medium;
case "L": return Priority.Low;
}
throw new ArgumentException("priorityCode");
}
}
现在,您可以使用Priorities.GetPriority(codeFromDatabase)
从DB代码中创建Priority
枚举元素,并调用
priority.GetCode()
要获取将优先级
写回数据库的代码。您可以将其实现为枚举
和静态类封装逻辑的组合,如下所示:
public enum Priority { High, Medium, Low }
public static class Priorities {
public static string GetCode(this Priority priority) {
switch (priority) {
case Priority.High: return "H";
case Priority.Medium: return "M";
case Priority.Low: return "L";
}
throw new ArgumentException("priority");
}
public static Priority GetPriority(string priorityCode) {
switch (priorityCode) {
case "H": return Priority.High;
case "M": return Priority.Medium;
case "L": return Priority.Low;
}
throw new ArgumentException("priorityCode");
}
}
现在,您可以使用Priorities.GetPriority(codeFromDatabase)
从DB代码中创建Priority
枚举元素,并调用
priority.GetCode()
要获取将优先级
写回数据库的代码。您可以将其实现为枚举
和静态类封装逻辑的组合,如下所示:
public enum Priority { High, Medium, Low }
public static class Priorities {
public static string GetCode(this Priority priority) {
switch (priority) {
case Priority.High: return "H";
case Priority.Medium: return "M";
case Priority.Low: return "L";
}
throw new ArgumentException("priority");
}
public static Priority GetPriority(string priorityCode) {
switch (priorityCode) {
case "H": return Priority.High;
case "M": return Priority.Medium;
case "L": return Priority.Low;
}
throw new ArgumentException("priorityCode");
}
}
现在,您可以使用Priorities.GetPriority(codeFromDatabase)
从DB代码中创建Priority
枚举元素,并调用
priority.GetCode()
要获取将优先级写入数据库的代码。根据具体情况,我有两种处理方法
第一种方法是使用enum
和Dictionary
将字符映射到enum
中的条目
enum Priority : byte
{
High,
Medium,
Low
}
static class Priorities
{
private static Dictionary<char, Priority> _toPriority = new Dictionary<char, Priority>();
private static Dictionary<Priority, char> _fromPriority = new Dictionary<Priority, char>();
static Priorities()
{
var priorities = Enum.GetNames(typeof(Priority));
var values = (Priority[])Enum.GetValues(typeof(Priority));
for (var i = 0; i < priorities.Length; i++)
{
_toPriority.Add(priorities[i][0], values[i]);
_fromPriority.Add(values[i], priorities[i][0]);
}
}
public static Priority GetPriority(string field)
{
Priority res;
if (!TryGetPriority(field, out res))
throw new ArgumentException("Invalid priority on field.", "field");
return res;
}
public static bool TryGetPriority(string field, out Priority priority)
{
if (field == null || field.Length == 0) { priority = default(Priority); return false; }
return _toPriority.TryGetValue(field[0], out priority);
}
public static char GetCode(Priority priority)
{
return _fromPriority[priority];
}
}
方法1:
优点:您只需定义枚举
,结果将自动更新。您可以访问全名(enumInstance.ToString()
)和代码。
缺点:您需要显式调用转换方法来在字符
和优先级
之间进行更改
方法2:
优点:该类型将隐式转换为char
,并且可以从char
缺点:您必须更新对register
的调用和enum
以添加或修改条目。无法访问字段的全名
方法二的两个缺点都可以很容易地解决。第一个问题可以通过使用反射来发现所有公共字段来解决。第二种方法是将其作为参数添加到构造函数中,或者也通过反射
使用方法1:
Priority p = Priority.High; // Assign literal
MessageBox.Show(p.ToString()); // High
MessageBox.Show(Priorities.GetCode(p).ToString()); // H
Priority p = Priorities.GetPriority('L'); // Cast from character
MessageBox.Show(p.ToString()); // Low
MessageBox.Show(Priorities.GetCode(p).ToString()); // L
Priority p; // Safe assigning
if (!Priorities.TryGetPriority('M', out p))
return;
MessageBox.Show(p.ToString()); // Medium
MessageBox.Show(Priorities.GetCode(p).ToString()); // M
使用方法2:
Priority p = Priority.High; // Assign literal
MessageBox.Show(p.ToString()); // H
Priority p = (Priority)'L'; // Cast from character
MessageBox.Show(p.ToString()); // L
Priority p; // Safe assigning
if (!Priority.TryGetPriority('M', out p))
return; // Handle invalid scenario
MessageBox.Show(p.ToString()); // M
我个人认为这个解决方案比依赖两个开关和定义要干净得多。性能方面(除非您有一个非常大的数据库,否则这并不重要),它的性能与switch语句非常相似。处于正确条件的switch语句将在代码hashmap中编译,就像字典
是hashmap一样
如果您想拥有多个字符串,只需将char
更改为string
根据具体情况,我有两种处理方法
第一种方法是使用enum
和Dictionary
将字符映射到enum
中的条目
enum Priority : byte
{
High,
Medium,
Low
}
static class Priorities
{
private static Dictionary<char, Priority> _toPriority = new Dictionary<char, Priority>();
private static Dictionary<Priority, char> _fromPriority = new Dictionary<Priority, char>();
static Priorities()
{
var priorities = Enum.GetNames(typeof(Priority));
var values = (Priority[])Enum.GetValues(typeof(Priority));
for (var i = 0; i < priorities.Length; i++)
{
_toPriority.Add(priorities[i][0], values[i]);
_fromPriority.Add(values[i], priorities[i][0]);
}
}
public static Priority GetPriority(string field)
{
Priority res;
if (!TryGetPriority(field, out res))
throw new ArgumentException("Invalid priority on field.", "field");
return res;
}
public static bool TryGetPriority(string field, out Priority priority)
{
if (field == null || field.Length == 0) { priority = default(Priority); return false; }
return _toPriority.TryGetValue(field[0], out priority);
}
public static char GetCode(Priority priority)
{
return _fromPriority[priority];
}
}
方法1:
优点:您只需定义枚举
,结果将自动更新。您可以访问全名(enumInstance.ToString()
)和代码。
缺点:您需要显式调用转换方法来在字符
和优先级
之间进行更改
方法2:
优点:该类型将隐式转换为char
,并且可以从char
缺点:您必须更新对register
的调用和enum
以添加或修改条目。无法访问字段的全名
方法二的两个缺点都可以很容易地解决。第一个问题可以通过使用反射来发现所有公共字段来解决。第二种方法是将其作为参数添加到构造函数中,或者也通过反射
使用方法1:
Priority p = Priority.High; // Assign literal
MessageBox.Show(p.ToString()); // High
MessageBox.Show(Priorities.GetCode(p).ToString()); // H
Priority p = Priorities.GetPriority('L'); // Cast from character
MessageBox.Show(p.ToString()); // Low
MessageBox.Show(Priorities.GetCode(p).ToString()); // L
Priority p; // Safe assigning
if (!Priorities.TryGetPriority('M', out p))
return;
MessageBox.Show(p.ToString()); // Medium
MessageBox.Show(Priorities.GetCode(p).ToString()); // M
使用方法2:
Priority p = Priority.High; // Assign literal
MessageBox.Show(p.ToString()); // H
Priority p = (Priority)'L'; // Cast from character
MessageBox.Show(p.ToString()); // L
Priority p; // Safe assigning
if (!Priority.TryGetPriority('M', out p))
return; // Handle invalid scenario
MessageBox.Show(p.ToString()); // M
我个人认为这个解决方案比依赖两个开关和定义要干净得多。性能方面(除非您有一个非常大的数据库,否则这并不重要),它的性能与switch语句非常相似。处于正确条件的switch语句将在代码hashmap中编译,就像字典
是hashmap一样
如果您想拥有多个字符串,只需将char
更改为string
根据具体情况,我有两种处理方法
第一种方法是使用enum
和Dictionary
将字符映射到enum
中的条目
enum Priority : byte
{
High,
Medium,
Low
}
static class Priorities
{
private static Dictionary<char, Priority> _toPriority = new Dictionary<char, Priority>();
private static Dictionary<Priority, char> _fromPriority = new Dictionary<Priority, char>();
static Priorities()
{
var priorities = Enum.GetNames(typeof(Priority));
var values = (Priority[])Enum.GetValues(typeof(Priority));
for (var i = 0; i < priorities.Length; i++)
{
_toPriority.Add(priorities[i][0], values[i]);
_fromPriority.Add(values[i], priorities[i][0]);
}
}
public static Priority GetPriority(string field)
{
Priority res;
if (!TryGetPriority(field, out res))
throw new ArgumentException("Invalid priority on field.", "field");
return res;
}
public static bool TryGetPriority(string field, out Priority priority)
{
if (field == null || field.Length == 0) { priority = default(Priority); return false; }
return _toPriority.TryGetValue(field[0], out priority);
}
public static char GetCode(Priority priority)
{
return _fromPriority[priority];
}
}
方法1:
优点:您只需定义枚举
,结果将自动更新。您可以访问全名(enumInstance.ToString()
)和代码。
缺点:您需要显式调用转换方法来在字符
和优先级
之间进行更改