Добавить элемент в нестатический объект из статического метода? - PullRequest
1 голос
/ 29 марта 2011

Я знаю, как использовать 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 Ответ

2 голосов
/ 29 марта 2011

Одним из решений будет добавление члена 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 в какой-либо другой части вашего приложения, когда оно будет доступно.

Хотя это решение будет работать, я бы не предпочел его, потому что оно нелогично.То, что вы делаете здесь, это объявляет в статической конфигурации цель журнала, которая вообще не имеет смысла в статическом контексте: вы хотите войти в элемент управления пользовательского интерфейса, который не был создан, нет хорошего способа ссылаться на него, пока приложение неПользовательский интерфейс был показан, и пользовательский интерфейс будет отображаться в некотором пункте или (академически говоря), может быть, совсем не так.

Я считаю, что предпочтительно создать свой собственный целевой класс журнала, производный отTarget или TargetWithLayout.Вы можете передать любые необходимые параметры (например, экземпляр ListView) в конструктор цели журнала и программно добавить цель журнала в тот момент, когда значения этих параметров станут известны (т. Е. Отображается пользовательский интерфейс, и у нас есть ListViewмы можем сослаться на).

...