我试图隐藏函数中的复杂性,以便进行简单的函数调用。例如,函数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, ...});
}
我的问题:每次调用Log()时,如何避免编码new object[]
构造?
答案 0 :(得分:4)
我同意接口是最干净的解决方案。如果这不是一个选项,您可以随时创建自己的使用params
的代理:
public delegate void FormattingLoggerDelegate(string format,
params object[] args);
AnotherFunction
看起来像这样:
public void AnotherFunction(FormattingLoggerDelegate log)
{
log("formatstring", value1, value2);
}
用法是透明的,即无需转发给您的代表。就像Action
一样,存在隐式演员:
AnotherFunction(Log);
答案 1 :(得分:1)
界面会更干净。您可能还需要考虑使用现有的日志记录框架(例如log4net或NLog),并实现将输出写入文本框的目标(或使用现有的目标)。