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 のレンダラーを作成し、それが使用しているジェネリックを確認することで実行できます。ジェネリックごとに 1 つのレンダラー クラスを作成することはできませんが、機能します。

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 に答える