1

我有几个通用集合,比如说,

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 吗?

4

1 回答 1

3

以下链接是更好的堆栈溢出答案。保持我的问题的完整性:

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 属性。

于 2012-08-30T13:13:00.440 回答