我有一個日誌記錄界面,我用一些有用的擴展方法進行了擴展,以便我可以傳遞格式和參數列表以避免每次都使用字符串格式一個電話的方法。 (這也幫助我跟着FXCops文化信息的規則)可選參數連同參數陣列
所以我可以打電話:
logger.Debug("Created {0} with id {1}",typeof(MyObject).Name ,myObject.Id);
相反的:
logger.Debug(string.Format("Created {0} with id {1}", typeof(MyObject).Name, myObject.Id));
我現在發現自己在一點點,因爲它棘手的局面對於在關於寫入日誌的日誌中獲取一些信息(如文件,方法和行號)也非常有幫助。這可以用整齊的[CallerMemberName]
,[CallerFilePath]
和[CallerLineNumber]
屬性來實現。
logger.Debug("Created {0} with id {1}", typeof(MyObject).Name, myObject.Id);
然後會給我一個日誌條目,如:
「MyObjectProvider.cs,提供,行:50 |創建myObject的ID爲1564」
這裏的問題是,方法簽名是這樣的:
public static void Debug(this ILogger logger, string format [CallerMemberName] string callerMemberName = "", [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = 0, params object[] args)
,這是不可能的,因爲[Caller*]
屬性MAK es參數是可選的,並且不適用於args參數。
我也試着與琴絃固定金額多個實現像這樣的參數:
public static void Debug(this ILogger logger, string format [CallerMemberName] string callerMemberName = "",string arg, string arg2 , ...etc... , [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = 0)
但後來我得到編譯器錯誤稱「的號召是以下方法或屬性之間的曖昧」
現在我幾乎已經放棄了這個問題,但我想,「也許SO可以爲我找到解決方案。」所以這裏是... 是否有可能以任何方式同時使用params object[] args
和[CallerFilePath]
,或者有其他方法可以獲得預期結果嗎?
另見http://stackoverflow.com/questions/3948971/c-sharp -4-0-optional-parameters-and-params-do-not-together-together – nawfal