2011-05-17 38 views
3

我是C#的新手,因此如果我的某些概念出現偏差,請原諒我。我正在使用Canon EDSDK,爲了讓生活更輕鬆,我希望能夠將錯誤消息看作文本而不是十六進制值。該EDSDK.cs文件包含錯誤,如一個長長的清單:關於在C中構建錯誤代碼查找的建議#

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方法?

回答

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

這似乎對我來說是完美的,因爲一切都在一個列表中,無需交叉引用它對字典。非常感謝您的快速幫助。 – mrbencowell 2011-05-17 17:11:24

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."); 
+0

你打敗了我:-)可以添加,你可以創建一個小的靜態錯誤查找包裝類'字符串ToErrorString(uint errorCode)'方法,執行查找字典。 – 2011-05-17 17:04:47

+0

我剛剛發佈幾乎相同的解決方案,但你得到了領導:) – Maverik 2011-05-17 17:05:07

2

你可以使用一個通用字典,而不是一個哈希表

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

然後你可以檢索你想要的值做

MessageBox.Show(myDict[errorCode]); 

爲了添加,我認爲你可以通過反射來做一些事情來反映EDSDK類並找到所有常量uint成員。然後遍歷該列表,添加值和常量名稱。

12

另一種可以做到這一點的方法是創建一個帶有描述屬性的Enum。詳情請參閱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 
} 

在非常簡單的,如果你一個說明didnt照顧,你可以在枚舉名稱轉換爲使用Enum.GetName

+1

酷..我剛剛從這裏瞭解到Description屬性!謝謝:) – Maverik 2011-05-17 17:06:12

+0

我也是..這真是太棒了..謝謝你! – mrbencowell 2011-05-17 17:18:48

0

首先的字符串,你應該使用通用字典而不是散列表。其次,我對Canon EDSDK一無所知,但它似乎很奇怪,它將一個錯誤代碼作爲一個十六進制字符串返回,而不是僅僅定義一個常量。這真的是他們如何被退回?如果是這樣,那很奇怪,但你應該能夠將它們轉換爲整數,否則,你可以跳過這一步。

如果你想創建一個使用反射陣列,你可以做這樣的事情:

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

如果錯誤碼爲一個字符串,轉換它首先使用:

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

好吧,另一個因爲我們正在滾動:-)
如果當前錯誤代碼未定義,此解決方案還會生成可讀的錯誤字符串。

創建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());