4

我需要创建一个具有两个属性的类:

  1. 日志输出
  2. 异常输出

这些属性 (Actions<>) 根据目标函数发送消息或异常。这个目标函数是通过属性设置的。

目前,我有这个功能代码:

    public class Output
    {
        private Action<string> logOutput;
        private Action<Exception, string> exceptionOutput;

        public Action<string> LogOutput { set { this.logOutput = value; } get { return this.logOutput; } }
        public Action<Exception, string> ExceptionOutput { set { this.exceptionOutput = value; } get { return this.exceptionOutput; } }

        public Output() : this(null, null) { }

        public Output(Action<string> logAction, Action<Exception, string> exceptionAction) 
        {
            this.logOutput = logAction;
            this.exceptionOutput = exceptionAction;
        }


        public void WriteLogMessage(string format, params object[] args) 
        {
            if (this.logOutput != null)
                logOutput(string.Format(format, args));
        }

        public void WriteExceptionMessage(Exception ex, string format, params object[] args) 
        {
            if (this.exceptionOutput != null)
                exceptionOutput(ex, string.Format(format, args));
        }
    }

这是我的表单代码:

    private void MainForm_Load(object sender, EventArgs e)
    {
        // my Output object
        Output myOutput = new Output();

        // set properties
        myOutput.ExceptionOutput = this.WriteExceptionMessageToTextBox;
        myOutput.LogOutput = this.WriteLogMessageToTextBox;

        // test
        myOutput.WriteLogMessage("this is my log message to text box");
        myOutput.WriteExceptionMessage(new Exception("this is my exception"), "this is my exception message to text box");
    }

    private void WriteLogMessageToTextBox(string message)
    {
        // nothing to do here
        if (this.txtBox.IsDisposed)
            return;

        if (this.InvokeRequired)
        {
            BeginInvoke(new MethodInvoker(delegate() { WriteLogMessageToTextBox(message); }));
        }
        else 
        {
            // write to text box
            this.txtBox.AppendText(message + Environment.NewLine);
        }
    }

    private void WriteExceptionMessageToTextBox(Exception ex, string message)
    {
        // nothing to do here
        if (this.txtBox.IsDisposed)
            return;

        if (this.InvokeRequired)
        {
            BeginInvoke(new MethodInvoker(delegate() { WriteExceptionMessageToTextBox(ex, message); }));
        }
        else
        {
            string msg = "";
            msg += string.Format("Program:{0}", message);
            msg += string.Format("Message{0}", ex.Message);
            msg += string.Format("StackTrace:{0}", ex.StackTrace);
            msg += string.Format("Source:{0}", ex.Source);

            // write to text box
            this.txtBox.AppendText(msg + Environment.NewLine);
        }
    }

这个模型对吗?还有另一种方法可以做到这一点吗?

4

2 回答 2

8

这个模型对吗?还有另一种方法可以做到这一点吗?

这没有什么错,必然。但是,事件 可能是一种更常见的处理方法,因为您在这种情况下有效地将委托用作事件。

使用事件确实有一个显着的优势(可能),因为您还可以轻松地拥有多个订阅者,这将使允许多个项目“侦听”异常或记录消息变得简单。(*虽然这也适用于代表,但它不是使用代表的标准方式..)

于 2012-07-05T15:43:31.037 回答
1

对不起题外话,但StringBuilder string不喜欢使用编辑

            string msg = "";
            msg += string.Format("Program:{0}", message);
            msg += string.Format("Message{0}", ex.Message);
            msg += string.Format("StackTrace:{0}", ex.StackTrace);
            msg += string.Format("Source:{0}", ex.Source);


            StringBuilder sb = new StringBuilder();
            sb.Append(string.Format("Program:{0}", message));
            sb.Append(string.Format("Message{0}", ex.Message));
            sb.Append(string.Format("StackTrace:{0}", ex.StackTrace));
            sb.Append(string.Format("Source:{0}", ex.Source));
            string result = sb.ToString();
于 2012-07-05T15:45:55.397 回答