C#传递带有变量参数列表的函数作为参数

时间:2013-04-22 09:00:58

标签: c# delegates params

我试图隐藏函数中的复杂性,以便进行简单的函数调用。例如,函数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[]构造?

2 个答案:

答案 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);

Demo

答案 1 :(得分:1)

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