我可以将参数传递给自定义log4net Appender的构造函数吗?
我想传递参数给一个自定义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[])
我不知道如果我理解你的目标,但如果你希望你的appender是可配置的,你基本上要对你的appender揭露的属性。然后,您可以以编程方式或在配置文件中设置此属性。
的UdpAppender暴露出这样一个属性:
public int LocalPort
{
get; set;
}
(它实际上是一个比较复杂的,因为他们是否在二传手的值是一个有效的端口。)
在配置文件你使用这样的:
<localPort value="8080" />
这非常适用于简单的类型,如字符串,整数......但也对于一些复杂的类型,如IPAddress
。如果你有自己的类型,那么使它工作起来会更困难,我将不得不首先检查它是如何完成的。
至于版本1.2.10,如果不修改源代码,这是不可能的。
相关的部分是在库\层次\ XmlHierarchyConfigurator.cs在行286:
`IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true));`
正如你所看到的,它应该使用
Activator.CreateInstance(Type, Object[])过载(或东西沿着这种方式),让我实现我的需要。
除非你说答案是“这是不可能的”,否则这个“答案”似乎是这个问题的更多信息...... – 2012-11-02 21:35:42
Stefan,问题正是你最后写的那个问题:我必须提供一个复杂的对象,它在运行时被实例化。 无法通过XML配置提供它。 – Simone 2010-10-15 12:21:29
您不能基于某些参数字符串创建此类的实例吗? – 2010-10-16 07:38:33
不,我必须通过另一个现有的对象。 – Simone 2010-11-11 11:59:03