當記錄時,你總是糾纏在字符串文字中。C#通過任何方法作爲參數
我解決了這個很好的屬性,字段和變量傳遞一個Expression<Func<T>> expression
(如解釋here),所以你可以做這樣的事情:
public void Demo(string someArgument)
{
LogFrameWork.LogLine("Demo"); // goal is to get rid of these string literals
LogFramework.Log(() => someArgument);
}
我想要做的方法Demo
本身類似的東西:
public void Demo(string someArgument)
{
LogFramework.Log(this.Demo);
}
我試過這樣的事情:
public static void Log(Delegate method)
{
string methodName = method.Method.Name;
LogLine(methodName);
}
這:
public static void Log(Action method)
{
string methodName = method.Method.Name;
LogLine(methodName);
}
,但我得到這樣的編譯器錯誤:
我介紹了一堆使用Func<...>和Action<...>過載,但聽起來過於複雜。
有沒有辦法用任何數量的參數和可選的結果來覆蓋這個方法?
--jeroen
PS:我覺得this question可能有一定的相關性在這裏,但沒有答案,這讓我一個「啊哈」的感覺:-)
但是,我理解你的問題,難道你不認爲你會更容易和更可擴展的一些AOP框架?您可以創建自定義屬性來標記在調用時應該記錄的方法。 – empi 2011-03-26 16:21:43
我過去使用過AOP,它導致編譯/鏈接時間猛增。由於.NET已經有了更高的編譯/鏈接時間,我寧願避免這種情況。 – 2011-03-26 16:29:38
針對我在表達式樹中看到的這個常見問題的每個解決方案都使用了多重重載方法,這也有點尷尬,因爲您需要包含參數。如果我要編寫手動跟蹤日誌記錄,我通常只是將方法名稱作爲字符串常量傳遞,並依靠Resharper來提醒我保持同步。 – 2011-03-26 16:33:52