1

我试图隐藏函数中的复杂性以方便函数调用。例如Log(string msg),用于将文本消息写入文本框控件的函数,带有换行符,以及用于多线程的 Invoke()。现在我想避免不得不使用Log(string.Format("..{0}..", x, ...))和编写一个Log(string format, params object[] args)非常有用的版本。

直到我需要将此 Log() 作为参数传递给另一个需要进行日志记录的函数:

AnotherFunction(Action<string, object[]> Log)
{
  Log("formatstring", new object[] { value1, value2, ...});
}

我的问题:如何避免new object[]每次必须调用 Log() 时都必须编写构造代码?

4

2 回答 2

4

我同意界面将是最干净的解决方案。但是,如果这不是一个选项,您始终可以创建自己的委托使用params

public delegate void FormattingLoggerDelegate(string format,
                                              params object[] args);

AnotherFunction看起来像这样:

public void AnotherFunction(FormattingLoggerDelegate log)
{
    log("formatstring", value1, value2);
}

使用将是透明的,即无需转换为您的代表。就像Action存在隐式转换一样:

AnotherFunction(Log);

演示

于 2013-04-22T09:10:09.013 回答
1

界面会更干净。您可能还想考虑使用现有的日志框架(例如 log4net 或 NLog),并实现一个将输出写入文本框的目标(或使用现有的)。

于 2013-04-22T09:05:41.373 回答