我正在log4net中创建自定义过滤器。我发现我可以将配置中的元素映射到过滤器类中的属性,如下所示:
<filter type="ConsoleApplication1.CustomFilter">
<FooKey value="FooValue"/>
</filter>
public class CustomFilter : FilterSkeleton
{
public string FooKey { get; set; }
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
return FilterDecision.Accept;
}
}
我想要做的是设置这样的项目列表:
<filter type="ConsoleApplication1.CustomFilter">
<FooKey value="FooValue"/>
<FooKey value="BarValue"/>
</filter>
public class CustomFilter : FilterSkeleton
{
public string[] FooKeys { get; set; }
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
return FilterDecision.Accept;
}
}
如果可以,我该怎么做?
答案 0 :(得分:5)
您可以在SetParameter
的{{1}}方法中找到导致此行为的代码。发生的是:
您无法从* .config文件中分配数组,因为配置程序仅处理标量值。但是,您可以创建一个方法,将新参数推送到自定义过滤器:
XmlHierarchyConfigurator
然后在您的配置文件中,您可以执行以下操作:
public class CustomFilter : FilterSkeleton
{
public string[] FooKeys { get; set; }
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
return FilterDecision.Accept;
}
public void AddFooKey(string text)
{
var temporaryFooKey = new List<string>(FooKeys ?? new List<string>().ToArray());
temporaryFooKey.Add(text);
FooKeys = temporaryFooKey.ToArray();
}
}
请注意,如果您不想更改xml元素的名称,可以使用<filter type="ConsoleApplication1.Filters.CustomFilter">
<FooKey name="AddFooKey" value="FooValue"/>
<AddFooKey value="BarValue"/>
</filter>
属性来指定必须访问过滤器的哪个部分,并且您还可以直接使用方法名称。