我是C#的新手,如果我的一些概念偏斜,请原谅我。我正在使用Canon EDSDK,为了让生活更轻松,我希望能够将错误消息看作文本而不是十六进制值。 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...
我的代码中的后者我可以抓取从其中一个EDSDK方法返回的错误消息,并以人类可读的形式显示它:
errorcode= EDSDK.EdsInitializeSDK();
MessageBox.Show(Convert.ToString(EDSDKErrorCodes[errorcode]));
我的问题是..这是处理所有这些错误代码的好方法,还是人们会推荐更好更有效的方法?如果是这样,我如何将哈希表填充为一系列常量而不必使用Add方法?
答案 0 :(得分:14)
另一种方法是通过创建带有描述属性的枚举。有关详细信息,请参阅here。这总结了它的外观:
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
将枚举名称转换为字符串答案 1 :(得分: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));
答案 2 :(得分:3)
我认为制作一个枚举会更优秀:
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.");
答案 3 :(得分:2)
您可以使用通用词典而不是哈希表
Dictionary<uint, String> myDict = new Dictionary<uint, String>();
然后,您可以通过执行
来检索所需的值MessageBox.Show(myDict[errorCode]);
对于添加,我认为您可以使用反射做一些事情来反映EDSDK类并找到所有常量uint成员。然后遍历该列表,添加值和常量名称。
答案 4 :(得分:2)
好的,自从我们开始滚动后的又一次采取:-)
如果未定义当前错误代码,此解决方案还会生成人类可读的错误字符串。
像这样创建Enum
:
public enum ErrorCode : uint
{
EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07,
EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08
}
然后,为枚举类型创建一个Extension Method,如下所示:
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());
答案 5 :(得分:0)
首先,您应该使用通用字典而不是哈希表。其次,我对佳能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;
}
然后您可以使用以下方式访问它:
MessageBox.Show(EDSDKErrorCodes[errorCode]);
如果errorCode是一个字符串,请先使用以下命令转换它:
uint errorNumber = uint.Parse(errorCode.Substring(2), System.Globalization.NumberStyle.HexNumber);