2010-10-15 101 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