在C#中实现回调

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

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

回答

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

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接口。您将传递一个记录器对象,而不是传递记录器函数。

这有以下优点:

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

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

  • Yes, you can do that. The advantage of a delegate is that you can give it a speaking name (hopefully a better one than `MyCallback` as in my example) and you can also name the parameters.

以上是在C#中实现回调的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>