4

私は C# を初めて使用するので、概念が歪んでいる場合はご容赦ください。私は Canon EDSDK を使用しています。生活を楽にするために、エラー メッセージを 16 進値ではなくテキストとして表示できるようにしたいと考えています。EDSDK.cs ファイルには、次のようなエラーの長いリストが含まれています。

public const uint EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07;
public const uint EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08;

理想的には、これらすべてをある種のルックアップ テーブルに入れ、HEX エラーコードを入力して実際のメッセージを文字列として返すことができるようにしたいと考えています。例えば

Hashtable EDSDKErrorCodes = new Hashtable();

EDSDKErrorCodes.Add("0x00008D01", "EDS_ERR_TAKE_PICTURE_AF_NG");
EDSDKErrorCodes.Add("0x00008D08", "EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG");
etc etc...

コードの後半では、EDDSK メソッドの 1 つから返されたエラー メッセージを取得し、それを人間が読める形式で表示できます。

errorcode= EDSDK.EdsInitializeSDK();

MessageBox.Show(Convert.ToString(EDSDKErrorCodes[errorcode]));

私の質問は..これはこれらすべてのエラーコードを処理する良い方法ですか、それとも人々が推奨するより良い効率的な方法はありますか? もしそうなら、Add メソッドを使用するのではなく、一連の定数としてハッシュ テーブルを埋めるにはどうすればよいでしょうか?

4

6 に答える 6

16

これを行う別の方法は、description属性を使用して列挙型を作成することです。詳細については、こちらをご覧ください。これは、それがどのように見えるかを要約しています。

public enum ErrorCodes : uint
{
    [Description("Description for EDS_ERR_TAKE_PICTURE_CARD_NG")]
    EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07,
    [Description("Description for EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG")]
    EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08
}

非常に簡単に言えば、説明を気にしない場合は、Enum.GetNameを使用して列挙型の名前を文字列に変換できます。

于 2011-05-17T17:05:12.153 に答える
6

これには列挙型を使用できます。

public enum ErrorCodes : uint
{
    EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07,
    EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08
}

次に、使用法は次のようになります。

ErrorCodes error = (ErrorCodes)EDSDK.EdsInitializeSDK();
MessageBox.Show(Enum.GetName(typeof(ErrorCodes), error));
于 2011-05-17T17:02:54.540 に答える
3

ハッシュテーブルの代わりに汎用辞書を使用できます

Dictionary<uint, String> myDict = new Dictionary<uint, String>();

次に、次の手順を実行して、必要な値を取得できます。

MessageBox.Show(myDict[errorCode]);

追加するために、EDSDKクラスを反映して、すべての定数uintメンバーを見つけるために、リフレクションを使用して何かを実行できる可能性があると思います。次に、値と定数名を追加して、そのリストを繰り返し処理します。

于 2011-05-17T17:04:06.413 に答える
3

列挙型を作成する方が優れていると思います:

public enum CanonErrorCode
{
    SomeErrorDescription = 14,
    SomeOtherErrorDescription = 15
    // .. etc
}

16 進数から整数への変換を行うだけです。次に、次のように簡単に呼び出すことができます。

// Samples
var myErrorCode = (CanonErrorCode)someIntegerValue;
var myErrorCode = CanonErrorCode.SomeOtherErrorDescription;

人間がフォーマットしたエラーの説明が必要な場合は、次のようなマッピングをお勧めします。

static Dictionary<int, string> errorlookups = new Dictionary<int, string>();

errorLookups.Add(10, "This is the human readable error message.");
errorLookups.Add(17, "Create this guy once in a static constructor.");
于 2011-05-17T17:01:33.547 に答える
2

わかりました、ローリングしているので別の見方です:-)
このソリューションは、現在のエラーコードが定義されていない場合、人間が読める形式のエラー文字列も生成します。

Enumそのように 作成します。

public enum ErrorCode : uint
{
    EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07,
    EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08
}

次に、次のように列挙型の拡張メソッドを作成します。

public static class ErrorHandler
{
    public static string ToErrorString(this ErrorCode errorCode)
    {
        return Enum.IsDefined(typeof(ErrorCode), errorCode) ? 
            errorCode.ToString() : "Undefined error code";
    }
}

そして最後に、次のように使用します。

var errorCode = (ErrorCode)EDSDK.EdsInitializeSDK();
MessageBox.Show(errorCode.ToErrorString());
于 2011-05-17T18:15:12.227 に答える
0

まず、ハッシュテーブルの代わりに一般的な辞書を使用する必要があります。第 2 に、Canon EDSDK については何も知りませんが、定数が定義されているため、単に uint ではなく 16 進文字列としてエラー コードを返すのは奇妙に思えます。それは本当に彼らが返されている方法ですか?もしそうなら、それは奇妙ですが、それらを整数に変換できるはずです。そうでない場合は、そのステップをスキップできます。

リフレクションを使用して配列を作成する場合は、次のようにすることができます。

Dictionary<int,String> EDSDKErrorCodes = new Dictionary<int,String>;
System.Reflection.FieldInfo[] fields = typeof(EDSDK).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
foreach (System.Reflection.FieldInfo field in fields) {
  EDSDKErrorCodes[(uint)field.GetValue(null)] = field.Name;
}

そして、次を使用してアクセスできます。

MessageBox.Show(EDSDKErrorCodes[errorCode]);

errorCode が文字列の場合は、まず次を使用して変換します。

uint errorNumber = uint.Parse(errorCode.Substring(2), System.Globalization.NumberStyle.HexNumber);
于 2011-05-17T17:07:49.617 に答える