从静态方法添加非静态对象中的元素?

时间:2011-03-29 13:45:43

标签: c# nlog

我知道如何使用nlog将我的信息记录在文件中,但现在我想将我的日志重定向到ListView(C#)并执行一些操作。所以我将日志指向了文档nlog中解释的方法。它有效。

<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
        <target name="msgbox" xsi:type="MethodCall" className="SomeNamespace.MyClass, MyAssembly" methodName="LogMethod">
            <parameter layout="${level}" />
            <parameter layout="${message}" />
        </target>
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="msgbox" />
    </rules>
</nlog>

Console.WriteLine有效。这不是我的问题。

namespace SomeNamespace
{
    using System;

    public class MyClass
    {
        public static void LogMethod(string level, string message)
        {
            Console.WriteLine("l: {0} m: {1}", level, message);
            // logListView.Items.Add(Message);
            // Do some other actions
        }
    }
}

我想在我的logListView中添加一行(参见注释行),但我不能,因为logListView不是静态的。怎么会这样?我该怎么办?

1 个答案:

答案 0 :(得分:2)

一种解决方案是将static成员添加到MyClass,如下所示:

public class MyClass
{
    public static ListView MyListView { get; set; }

    public static void LogMethod(string level, string message)
    {
        Console.WriteLine("l: {0} m: {1}", level, message);
        var logListView = MyListView;
        if (logListView != null) {
            logListView.Items.Add(Message);
        }
        // Do some other actions
    }
}

您可以在应用程序的其他部分设置MyListView的值。

虽然这个解决方案可行,但我不喜欢它,因为它反直觉。你在这里做的是在静态配置中声明一个在静态上下文中根本没有意义的日志目标:你想要登录到尚未创建的UI控件,没有好的方法来引用它直到应用程序的UI已经显示,UI将显示在某些点或(学术上讲)可能根本不显示。

我认为最好创建一个源自TargetTargetWithLayout的自己的日志目标类。您可以将任何必要的参数(例如ListView实例)传递给日志目标的构造函数,并以编程方式在这些参数的值已知的位置添加日志目标(即显示UI并且我们有{ {1}}我们可以参考)。