2014-03-06 74 views
16

我使用BitFactory記錄,暴露出這樣的一堆方法:強制我的代碼使用我的擴展方法

public void LogWarning(object aCategory, object anObject) 

我有一個擴展方法,使我們更好的日誌記錄這一點需求:

public static void LogWarning(this CompositeLogger logger, 
     string message = "", params object[] parameters) 

剛剛包紮一些常見的伐木作業,並意味着我可以登錄像:

Logging.LogWarning("Something bad happened to the {0}. Id was {1}",foo,bar);

但是,當我在我的params object[]中只有一個字符串時,我的擴展方法將不會被調用,而是選擇原始方法。

除了命名我的方法別的,有沒有辦法阻止這種情況發生?

+2

類方法始終優先通過擴展方法,所以我會說不。但也許有人知道一些解決方法。 – Gorpik

+0

擴展方法(帶有類似命名的非擴展方法),可選參數,*和*'params'都在一個方法中?你喜歡混淆編譯器,不是嗎? –

回答

14

如何重載方法的解析到一個(或錯誤)的規則是複雜的(在C#規範包含在Visual Studio中用於所有血腥細節)。

但是有一條簡單的規則:只有在沒有可能被調用的成員時才考慮擴展方法。

由於兩個對象的簽名會接受任何兩個參數,所以任何具有兩個參數的調用都將匹配該成員。因此沒有任何擴展方法將被視爲可能性。

您可以傳遞第三個參數(例如String.Empty),而不是在格式中使用它。

或者,我懷疑這是更好的,以避免與添加到庫的可能交互(可變長度參數列表方法很容易)重命名爲LogWarningFormat(類似於StringBuffer.AppendFormat的命名)。

PS。 message參數的默認值沒有任何意義:除非不傳遞任何參數,否則它將永遠不會使用:但不會記錄任何內容。

+0

感謝PS關於郵件的默認設置。 –

8

聲明的方法總是先於擴展方法。 如果您想要調用擴展而不考慮已聲明的方法,則必須將其稱爲聲明它的類的常規靜態方法。

如:

LoggerExtensions.LogWarning(Logging, "Something bad happened to the {0}. Id was {1}",foo,bar); 

我假設擴展是在一個名爲類中聲明LoggerExtensions

2

只要我想用不同的名稱的方法是要走的路(更容易閱讀和維護),作爲一種解決方法,你可以指定參數爲命名參數:

logger.LogWarning("Something bad happened to the {0}.", parameters: "foo"); 
相關問題