2010-10-15 99 views
8

我想傳遞參數給一個自定義appender的構造函數,所以我想我必須重寫Appenders的初始化機制。問題在於,我無法在文檔中找到將其掛鉤的方式,這使我認爲這是不可能的(或者文檔不完整)。我可以將參數傳遞給自定義log4net Appender的構造函數嗎?

至於版本1.2.10,這是不可能的,無需修改源代碼。相關的部分是在Repository\Hierarchy\XmlHierarchyConfigurator.cs:L286

IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true)); 

正如你所看到的,它應該使用這種過載(或東西沿着這種方式),讓我實現我的需求。

Activator.CreateInstance(Type, Object[]) 

回答

4

我不知道如果我理解你的目標,但如果你希望你的appender是可配置的,你基本上要對你的appender揭露的屬性。然後,您可以以編程方式或在配置文件中設置此屬性。

的UdpAppender暴露出這樣一個屬性:

public int LocalPort 
{ 
    get; set; 
} 

(它實際上是一個比較複雜的,因爲他們是否在二傳手的值是一個有效的端口。)

在配置文件你使用這樣的:

<localPort value="8080" /> 

這非常適用於簡單的類型,如字符串,整數......但也對於一些複雜的類型,如IPAddress。如果你有自己的類型,那麼使它工作起來會更困難,我將不得不首先檢查它是如何完成的。

+2

Stefan,問題正是你最後寫的那個問題:我必須提供一個複雜的對象,它在運行時被實例化。 無法通過XML配置提供它。 – Simone 2010-10-15 12:21:29

+0

您不能基於某些參數字符串創建此類的實例嗎? – 2010-10-16 07:38:33

+0

不,我必須通過另一個現有的對象。 – Simone 2010-11-11 11:59:03

1

至於版本1.2.10,如果不修改源代碼,這是不可能的。

相關的部分是在庫\層次\ XmlHierarchyConfigurator.cs在行286:

`IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true));` 

正如你所看到的,它應該使用

Activator.CreateInstance(Type, Object[])
過載(或東西沿着這種方式),讓我實現我的需要。

+0

除非你說答案是「這是不可能的」,否則這個「答案」似乎是這個問題的更多信息...... – 2012-11-02 21:35:42

相關問題