在 C# 中实现回调

时间:2020-12-25 17:19:49

标签: c#

刚接触 C# 并试图弄清楚如何进行回调。 (如果这确实是回调)

我有一些格式为..

的电话
        connector.Subscribe(data1, data2, (element, value) =>
        {
            Log($"{element.Name}: {value}");
        });

而且我想让它们都使用相同的功能,而不是将代码添加到每个 例如

    public void somefunction(element, value)
    {
        Log($"{element.Name}: {value}");
    }

    connector.Subscribe(data1, data2, somefunction);

老实说,我不知道从哪里开始,所以感谢任何帮助

1 个答案:

答案 0 :(得分:8)

声明一个签名与函数签名相匹配的委托。例如:

public delegate void MyCallback(string name, int value);

然后声明 Subscribe

public void Subscribe(object data1, object data2, MyCallback myCallback)
{
}

然后你就可以做你所要求的:

connector.Subscribe(data1, data2, somefunction);

注意 somefunction 此处必须不带参数大括号。


另一种解决问题的方法是声明一个合适的接口。例如。 ILogger 接口。不是传递记录器函数,而是传递记录器对象。

这样做有好处:

  • 您可以注入记录器。见Dependency injection (Wikipedia)
  • 您可以使用 IoC Container (TutorialsTeacher) 将记录器配置为在中心位置使用。
  • 您可以创建一个实现 ILogger 的包装器对象,它本身在构造函数中接受 ILogger 对象的列表。例如。你可以传递一个控制台记录器和一个文件记录器。呼叫站点不需要知道您希望所有内容都被记录两次。
  • 如果您不想记录,您可以使用一个虚拟记录器,什么都不做(同样无需更改调用站点)。

换句话说。接口比委托更灵活。

相关问题