C# 从静态方法在非静态对象中添加元素?

C# 从静态方法在非静态对象中添加元素?,c#,nlog,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"> <targ

我知道如何使用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>

我想在我的logListView中添加一行(请参阅注释行),但我不能,因为logListView不是静态的。为什么呢如何继续?

一个解决方案是向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将在某个点或(学术上)显示也许一点也不


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

+1派生的
目标
在这些类型的场景中工作得非常好。
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
    }
}