如何制作日志

时间:2018-09-30 10:09:09

标签: c# winforms events logging jobs

为进一步说明,我有一个Main Form,其中包含大量工作。
列表中的每个项目都是我的班级Jobs的实例。
单击一个项目时,将打开另一个Form,用户可以在其中编辑所选作业的信息。我将作业对象从Main Form传递到详细信息Form,然后通过TextBoxesComboBoxes等对其进行编辑。

现在,我需要检测作业的哪些属性已更改并将其写入日志文件。我知道如何写入日志文件,但是我不知道如何检测哪些属性已更改。

我可以去写30条if语句,在其中我可以比较起点和终点,但是我有30个属性,那将是一团糟。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

看看INotifyPropertyChanged:https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-implement-the-inotifypropertychanged-interface

示例

using log4net;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private static readonly ILog Logger = LogManager.GetLogger(typeof(Form1).FullName);
        public PersonViewPresenter Presenter { get; private set; }
        public Form1()
        {
            InitializeComponent();
            Presenter = new PersonViewPresenter();
            Presenter.PropertyChanged += Presenter_PropertyChanged;
            AddBindings();
        }

        private void Presenter_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            Logger.Info($"Property changed {e.PropertyName}");
        }

        private void AddBindings()
        {
            _firstnameTextbox.DataBindings.Add(new Binding(nameof(_firstnameTextbox.Text), Presenter, nameof(Presenter.FirstName), false, DataSourceUpdateMode.OnValidation));
            _lastnameTextBox.DataBindings.Add(new Binding(nameof(_lastnameTextBox.Text), Presenter, nameof(Presenter.LastName), false, DataSourceUpdateMode.OnValidation));
        }
    }
}

ViewPresenter实施

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace WindowsFormsApp1
{
    public class PersonViewPresenter : ViewPresenterBase
    {
        private string _lastName;
        private string _firstName;

        public string FirstName
        {
            get => _firstName; set
            {
                if (_firstName != value)
                {
                    _firstName = value;
                    NotifyPropertyChanged();
                }
            }
        }

        public string LastName
        {
            get => _lastName; set
            {
                if (_lastName != value)
                {
                    _lastName = value;
                    NotifyPropertyChanged();
                }
            }
        }
    }

    public abstract class ViewPresenterBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}