c# - 如何根据程序的性质显示消息

标签 c#

抱歉,文字太长。

我有一个 C# 类库,它从各种系统检索信息、调用外部函数、验证此信息并将验证结果生成到文件中。该库可以从以下位置模糊地调用:1) DOS 控制台程序,2) Windows 窗体或 3) Windows 服务程序。

用户要求我修改该库,以便它可以以详细的方式运行,即显示某些步骤的日期和时间,简要解释某个步骤或方法正在做什么,等等。他们还要求我提供引入异常处理并显示错误消息。

如果我在控制台模式下执行,我应该在控制台上显示消息,如果我从 Windows 窗体执行,我应该将消息发送到消息框或文本框,如果我从 Windows 服务运行,我应该将消息发送到消息框或文本框。应该将消息发送到日志文件。

我有 2 个问题:

1) 我应该如何修改 C# 类才能避免不断的求值: 如果程序处于控制台模式 writeline….. 否则,如果程序处于 Windows 窗体模式 messagebox 或 textbox.text ... 否则,如果程序是从 Windows 服务程序 writelogfile 调用的……

2) 如果上述评估不可避免,我如何知道 C# 类库是否被控制台、Windows 窗体 Windows 服务程序调用?

谢谢!!


可能的解决方案:


我读了一些关于 MS Enterprise Library 的内容,...这对于我的适度要求来说太多了,所以我选择了 Reed 的实用解决方案。

我分享的是我解决用户需求的方法,这是应用到实际情况之前的一个初步模型,所以在接受Reed解决方案之前,非常欢迎您提出改进和学习的意见。

1) 我创建了一个小库来定义所有可能的输出,在本例中我仅定义了控制台和 WPF 表单的输出:

命名空间diClass { 公共(public)接口(interface)IVerbose { 无效显示(字符串消息,对象文本框); 无效通知(字符串消息); }

public class ConsoleOutput : IVerbose
{
    public void show(string msg, object textBox)
    {
        System.Console.WriteLine(msg);
    }

    public void notify(string msg)
    {
        System.Console.WriteLine("Notif: " + msg);           
    }

}

public class WpfOutput : IVerbose
{
    public void show(string msg, object textBox)
    {
        TextBox tb = (TextBox)textBox;
        tb.Text += msg + "\r\n";
        System.Windows.Forms.Application.DoEvents();
    }
    public void notify(string msg)
    {
        MessageBox.Show(msg);
    }
}

public class Output
{
    IVerbose outputType;

    public IVerbose verboseType
    {
        get { return outputType; }
        set { outputType = value; }
    }

    public void show(string msg, object textBox)
    {
        outputType.show(msg, textBox);
    }

    public void notify(string msg)
    {
        outputType.notify(msg);
    }
}

}

2)然后我定义了一个使用上述库的控制台程序:

class Program
{
    static void Main(string[] args)
    {
        IVerbose verboseType = (IVerbose)Activator.CreateInstance(typeof(diClass.ConsoleOutput));
        Output o = new Output();
        o.verboseType = verboseType;
        object textBox1 = null;
        o.show(string.Format("{0}: Reading Accountig data", DateTime.Now.ToString("dd/MM/yy hh:mm:ss")), textBox1);
        o.notify(string.Format("{0}: Application error", DateTime.Now.ToString("dd/MM/yy hh:mm:ss")));
    }
}

3)最后我定义了一个也使用上述库的WPF程序:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        IVerbose verboseType = (IVerbose)Activator.CreateInstance(typeof(diClass.WpfOutput));
        Output o = new Output();
        o.verboseType = verboseType;
        o.show(string.Format("{0}: Reading Accountig data", DateTime.Now.ToString("dd/MM/yy hh:mm:ss")), textBox1);
        o.notify(string.Format("{0}: Application error", DateTime.Now.ToString("dd/MM/yy hh:mm:ss")));
    }
}

在程序 2) 和 3) 中,最后两行代码是相等的,没有 if 并且,这就是我想要的答案。

问候。

最佳答案

不要尝试处理所有这些情况,而是考虑添加写入详细日志的日志记录(例如 Enterprise Library Logging Application Block 或任何其他日志记录工具),这将帮助您满足所有要求,即时间戳、方法执行信息、异常、错误。

关于c# - 如何根据程序的性质显示消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1959377/

相关文章:

c# - 为什么这个 linq 查询返回一个 bool 值而不是选择的第一个结果?

c# - Repeater、Custom Paging、PagedDataSource,可能吗?

c# - ASP.Net Core 2 错误处理 : How to return formatted exception details in Http Response?

c# - 对委托(delegate)的引用是否构成对对象的引用(以防止垃圾收集)?

C# 不可变哈希集锁定

c# - 在不使用子文档中的鉴别器的情况下将 C# 类序列化到 MongoDB

c# - 检查输入的数字是否具有整数值

c# - ASP.Net Core,在 Controller 中检测调试与不调试

c# - Mongodb c# 库异步

c# - Java 注解 C# 等价物