我有几个通用集合,比如说,
IList<MyClass>
IList<MyOtherClass>
1)如何为此编写log4net IObjectRenderer?到目前为止我得到的是:
public class ListOfMyClassRenderer : IObjectRenderer
{
public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
{
try
{
var myList = obj as List<MyClass>;
int no = 1;
foreach (MyClass entry in myList)
{
writer.Write("Entry {0}: PropertyA={1} PropertyB={2}\n",
no++,
entry.PropertyA,
entry.PropertyB);
}
}
catch (NullReferenceException ex)
{
writer.Write(SystemInfo.NullText);
}
}
}
2)我如何在Log4Net.config文件中配置它?我有:
<renderer renderingClass="MyNamespace.ListOfMyClassRenderer" renderedClass="System.Collections.IList<MyClass>" />
3)最后一个问题。如果我想将每个条目写入log4net属性,我该怎么做?我应该使用RendererMap吗?
答案 0 :(得分:2)
以下链接是 Better Stack Overflow Answer 。保持我的完整性问题:
1)这可以通过制作IList的渲染器并询问它使用的是哪种泛型来完成。我们不能为每个仿制药制作一个渲染器类,但是可以工作。
class MyListRenderer : IObjectRenderer
{
public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
{
var myList = obj as IList<MyClass>;
if (myList != null) {
try
{
int no = 1;
foreach (MyClass entry in myList)
{
writer.Write("Entry {0}: PropertyA={1} PropertyB={2}\n",
no++,
entry.PropertyA,
entry.PropertyB);
}
}
catch (NullReferenceException ex)
{
writer.Write(SystemInfo.NullText);
}
}
else
{
new DefaultRenderer().RenderObject(rendererMap, obj, writer);
}
}
}
注意如果其他所有内容都失败,我们将如何使用默认渲染器。这保留了默认的IList渲染。可能已经扩展了DefaultRenderer(),但它已被密封。
2)可以使用
进行配置<renderer renderingClass="MyNamespace.MyListRenderer" renderedClass="System.Collections.IList" />
3)似乎无法使用对象渲染器设置log4net属性。