Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据库字段中处理字母枚举代码_C#_Enums_Datamodel - Fatal编程技术网

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()
)和代码。
缺点:您需要显式调用转换方法来在
字符
优先级
之间进行更改