C# 关于在C中构建错误代码查找的建议#

C# 关于在C中构建错误代码查找的建议#,c#,edsdk,C#,Edsdk,我是C#的新手,如果我的一些概念有偏差,请原谅我。我正在使用佳能EDSDK,为了让生活更轻松,我希望能够将错误消息视为文本,而不是十六进制值。EDSDK.cs文件包含一长串错误,例如: public const uint EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07; public const uint EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08; 理想情况下,我希望将所有这些放入某种查找表中,以便输

我是C#的新手,如果我的一些概念有偏差,请原谅我。我正在使用佳能EDSDK,为了让生活更轻松,我希望能够将错误消息视为文本,而不是十六进制值。EDSDK.cs文件包含一长串错误,例如:

public const uint EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07;
public const uint EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08;
理想情况下,我希望将所有这些放入某种查找表中,以便输入十六进制错误代码并以字符串形式返回实际消息。比如说

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...
在稍后的代码中,我可以获取从一个EDSDK方法返回的错误消息,并以人类可读的形式显示它:

errorcode= EDSDK.EdsInitializeSDK();

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

我的问题是。。这是处理所有这些错误代码的好方法,还是人们会推荐一种更好、更有效的方法?如果是这样的话,我如何才能将哈希表填充为一系列常量,而不必使用Add方法?

我认为创建枚举会更好:

public enum CanonErrorCode
{
    SomeErrorDescription = 14,
    SomeOtherErrorDescription = 15
    // .. etc
}
只需将十六进制转换为整数即可。然后你可以简单地这样称呼它:

// 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.");
static Dictionary errorlookups=new Dictionary();
添加(10,“这是人类可读的错误消息”);
添加(17,“在静态构造函数中创建这个家伙一次”);

您可以为此使用枚举

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));

您可以使用通用字典而不是哈希表

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

对于添加,我认为您可能可以使用反射来对EDSDK类进行反射,并找到所有常量uint成员。然后遍历该列表,添加值和常量名称

另一种方法是使用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
}

最简单的情况是,如果不关心描述,可以使用

将枚举名称转换为字符串。首先,应该使用通用字典而不是哈希表。其次,我对Canon EDSDK一无所知,但它以十六进制字符串的形式返回错误代码,而不是在定义常量时简单地返回uint,这似乎很奇怪。他们真的是这样被送回的吗?如果是这样,这很奇怪,但您应该能够将它们转换为整数,否则,您可以跳过该步骤

如果要使用反射创建阵列,可以执行以下操作:

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;
}
public static class ErrorHandler
{
    public static string ToErrorString(this ErrorCode errorCode)
    {
        return Enum.IsDefined(typeof(ErrorCode), errorCode) ? 
            errorCode.ToString() : "Undefined error code";
    }
}
如果errorCode是一个字符串,请首先使用以下命令将其转换:

uint errorNumber = uint.Parse(errorCode.Substring(2), System.Globalization.NumberStyle.HexNumber);

好的,我们正在进行另一次拍摄:-)
如果未定义当前错误代码,此解决方案还会生成一个人类可读的错误字符串

创建一个
Enum
,如下所示:

public enum ErrorCode : uint
{
    EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07,
    EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08
}
然后,为枚举类型创建一个

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;
}
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());

你比我快了:-)可以补充说,你可以用一些小的
string-to-errorstring(uint-errorCode)
方法创建一个静态错误查找包装类,在字典中执行查找。我正要发布几乎相同的解决方案,但你得到了线索:)酷。。我刚刚从中了解了描述属性!谢谢:)请注意,如果将来需要为新发现的错误添加枚举值,可能会破坏兼容性。这对我来说似乎很完美,因为所有内容都在一个列表中,无需对照字典进行交叉引用。非常感谢您的快速帮助。