是否可以使用委托来允许调用进程提供要运行的外部函数

本文关键字:进程 运行 函数 外部 调用 可以使 许调用 是否 | 更新日期: 2023-09-27 18:13:21

我创建了一个处理加密数据库流量的类。我已经成功地使用了外部事件定义,允许调用进程正确地处理错误,尽管这些错误发生在数据库模块中,但实际上是由调用过程产生的。

使用外部错误处理程序,我将执行以下操作:
public event EventHandler ErrorStatusChanged;

…之后,如果/当这种情况发生时,我会这样处理:

if (ErrorStatusChanged != null)
   {
      ErrorStatusChanged(this, EventArgs.Empty);
   }

…这似乎很有效。但是,现在我想使用回调函数进一步扩展,但是我只有一些如何处理这种情况的线索。(我确信这是可能实现的,但我对实际实现相当困惑……)

类似:

public delegate void Update_System_Status (bool dbConnected, string textStatus);

…然后后来(我确信我错了,编译器甚至在编译时间之前标记它):

if (Update_System_Status != null)
   {
       Update_System_Status(bConnFlag, sConnTextStatus);
   }

我想构建两个回调——一个允许数据处理程序类通知调用进程它已成功连接(或未连接),另一个在较长的大规模更新过程中处理更新进度条。在使用[callback]和/或[delegate]作为关键字进行了多次搜索后,我很快就一无所获。然而,我真的对感到困惑!

我曾设想我将提供某种接口,非常类似于EventHander(上面),并且能够确定-稍后,当需要时-调用过程是否提供了适当的函数,并在可能的情况下调用它。我知道不是所有的程序员都想为这个数据库处理程序提供一个主表单更新回调函数,所以我想我需要以某种方式"知道"什么时候提供了一个,什么时候没有。

我没有成功地使用[delegate]关键字,并且完全不知道如何使用[interface]指令-我一直在运行的所有示例都说明了函数是类的内部,这正是我想要实现的。我试图提供一个框架,允许外部进程提供一个函数,当类/对象内部发生某些事情时,可以很好地更新外部(调用)系统,可以通过调用提供的函数(从外部)来实现。

(提前)感谢你的帮助——我迷路了!

是否可以使用委托来允许调用进程提供要运行的外部函数

我认为你的问题是你只是声明了一个委托类型-你没有声明该类型的属性

试试这样写:

public delegate void MyDelegateType(bool dbConnected, string textStatus);
public MyDelegateType Update_System_Status { get; set; }

那么你应该可以随心所欲地使用它:

if (Update_System_Status != null)
{
    Update_System_Status(bConnFlag, sConnTextStatus);
}

但是如果你要像这样使用它,你最好把它变成一个事件:

public event MyDelegateType MyEvent;

您正确地声明了委托。你缺少的是这个类的一个成员,它将使用那个委托声明。您尝试的代码对于事件(多播委托)是有效的,尽管您省略了event定义本身(因此您的代码不起作用)。回调函数通常通过方法调用传递(但你也可以通过属性传递):

public void DoSomething(Update_System_Status callback)
{
    // call callback
    callback?.Invoke(false, "some status");
}

public Update_System_Status Callback {get; set;}
// and then somewhere (using pre C# 6.0 syntax)
var callback = Callback;
if(callback != null)   
    callback(true, "some status");

如果你不需要合适的参数名(在你的情况下,他们有不同的类型,所以不可能犯错误),那么你可以简单地使用Action<>,而不需要在之前声明委托:

public void DoSomething(Action<bool, string> callback) { ... }