OK、つまり、可能な状態コードの数が少ない char(1) 型のデータベース フィールドがあります (たとえば、「F」= 失敗、「U」= 不明など)。これらの状態に対応する C# 列挙型クラスが必要です。できます:
public enum StatusCode : byte {
Unknown = (byte) 'U',
Failure = (byte) 'F',
// etc.
}
ここまでは順調ですね。しかし、データベースから返された DataTable では、列の値は System.Data.SqlTypes.SqlString インスタンスです。C# 文字列 (または C# char) から C# バイトへの変換には明らかにいくつかの問題があります (C# char は実際には UTF-16 コードポイントであるため)。しかし、この場合、値が小さなセットに制限されていることがわかっており、このセット外の値が渡された場合、コードは例外をスローする必要があります。
それを念頭に置いて、これを行う最良の方法は何ですか?SqlString からバイトにキャストしても安全ですか? Convert.ToByte() の方が良いでしょうか? 単純にスイッチ/ケース構成を使用して、値を列挙型にクロスウォークする方がよいでしょうか?
正しい結果を得るためだけでなく、コードを明確にするためにも、これを行うための「最良の」方法を探しています。次のような定数を使用することもできると思います
public const char UnknownStatus = 'U';
public const char FailureStatus = 'F';
しかし、可能であれば列挙型を使用したいと思います。何かご意見は?
編集:これで何をしたいのかを明確にするために、コード全体でこれらの値を頻繁に使用することを期待しています。たとえば、次のようなことができるようになりたいです。
public void DoSomething(StatusCode currentStatus) {
if(currentStatus == StatusCode.Failure) {
throw new SomeException();
}
switch(currentStatus) {
case StatusCode.Unknown:
// do something
break;
}
}
などなど。特に次のようなことは避けたいです。
public void DoSomething(char currentStatus) {
if(currentStatus == 'F') {
// do something
}
}
この場合、至る所で「マジックナンバー」に相当するものを使用しているためです。特に、これにより、他の状態フラグシステムへの移行が事実上不可能になります。それは理にかなっていますか?