好的,所以我有一个char(1)类型的数据库字段,它有少量可能的状态代码(例如'F'= Failure,'U'= Unknown等).我想要一个与这些状态相对应的C#enum类.我可以:
public enum StatusCode : byte {
Unknown = (byte) 'U',
Failure = (byte) 'F',
// etc.
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是在从数据库返回的DataTable中,列值是System.Data.SqlTypes.SqlString实例.显然有一些问题从C#字符串(甚至是C#字符)转换为C#字节(因为C#char实际上是UTF-16代码点).但在这种情况下,我知道值被约束为一个小集合,如果此集合之外的值通过,代码应抛出异常.
考虑到这一点,最好的方法是什么?从SqlString转换为字节是否安全?Convert.ToByte()会更好吗?简单地使用开关/案例构造将值交叉到枚举中会更好吗?
我正在寻找"最好"的方法,不仅在获得正确的结果方面,而且在代码清晰度方面.我想我也可以使用一些常量
public const char UnknownStatus = 'U';
public const char FailureStatus = 'F';
Run Code Online (Sandbox Code Playgroud)
但如果可能的话,我宁愿使用枚举.有什么想法吗?
编辑:为了澄清我想要做什么,我希望在我的代码中经常使用这些值.例如,我希望能够做到这样的事情:
public void DoSomething(StatusCode currentStatus) {
if(currentStatus == StatusCode.Failure) {
throw new SomeException();
}
switch(currentStatus) {
case StatusCode.Unknown:
// do something
break;
}
}
Run Code Online (Sandbox Code Playgroud)
等等.我特别想避免这样的事情:
public void DoSomething(char currentStatus) {
if(currentStatus == 'F') {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
因为在这种情况下,我正在使用相当于"神奇数字"的地方.特别是,这将使迁移到其他一些状态标记系统几乎是不可能的.那有意义吗?
也许是一个"恒定"的对象?
public sealed class StatusCode {
private char value;
public static readonly StatusCode Unknown = new StatusCode('U');
public static readonly StatusCode Failure = new StatusCode('F');
private StatusCode(char v) {
value = v;
}
public override string ToString() {
return value.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在您的代码中,您可以像枚举一样使用它:StatusCode.Unknown
.您还可以提供一种内部方法,将收到的值"解析"为StatusCode的对象.
归档时间: |
|
查看次数: |
5314 次 |
最近记录: |