是否可以使用委托来允许调用进程向 运行 提供外部函数?
Is it possible to use Delegates to allow a calling process to provide an external function to run?
我创建了一个 class 来处理加密的数据库流量。我已成功使用外部事件定义,允许调用进程正确处理错误 - 虽然它们发生在数据库模块中 - 实际上源自调用过程。
使用外部错误处理程序,我将执行以下操作:
public event EventHandler ErrorStatusChanged;
...后来出现if/when这种情况,我会这样处理:
if (ErrorStatusChanged != null)
{
ErrorStatusChanged(this, EventArgs.Empty);
}
...这似乎工作得很好。但是,现在我想使用回调函数进一步扩展,但我只有一些线索可以处理这种情况。 (我确信有可能做到这一点,但我相当 lost/confused 关于实际实施...)
类似于:
public delegate void Update_System_Status (bool dbConnected, string textStatus);
...然后稍后(我确定我弄错了,编译器甚至在编译时间之前就标记了它):
if (Update_System_Status != null)
{
Update_System_Status(bConnFlag, sConnTextStatus);
}
我想构建几个回调 - 一个允许数据处理程序 class 通知调用进程它已成功连接(或未连接),另一个用于处理更新进度条较长的批量更新过程。在使用 [callback] and/or [delegate] 作为关键字进行多次搜索之后,我很快就一无所获。然而,我真的感到困惑!
我曾设想我会提供某种接口,与 EventHander(以上)非常相似,并且能够确定 - 稍后,当需要时 - 调用过程是否提供了正确的功能,并调用它 if/when 可能。我知道并不是所有的程序员都想为这个数据库处理程序提供一个主窗体更新回调函数,所以我想我需要以某种方式 "know" 何时提供,何时不提供。
我没有成功地使用 [delegate] 关键字,并且根本不知道如何使用 [interface] 指令 - 我保留 运行 的所有示例都说明了 class,这完全不是我想要达到的目标。我正在尝试提供一个框架,该框架将允许外部进程提供一个函数,当 class/object 内部发生某些事情可以很好地更新外部(调用)系统时,可以通过调用提供的函数来实现(从外面)。
(提前)感谢您的帮助 - 我迷路了!
我认为你的问题是你只声明了一个委托类型 - 你没有声明那种类型的 属性
尝试这样的事情:
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;
您正确声明了委托。您缺少的是此 class 的成员,它将使用该委托声明。您尝试的代码对事件(多播委托)有效,尽管您省略了 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) { ... }
我创建了一个 class 来处理加密的数据库流量。我已成功使用外部事件定义,允许调用进程正确处理错误 - 虽然它们发生在数据库模块中 - 实际上源自调用过程。
使用外部错误处理程序,我将执行以下操作:
public event EventHandler ErrorStatusChanged;
...后来出现if/when这种情况,我会这样处理:
if (ErrorStatusChanged != null)
{
ErrorStatusChanged(this, EventArgs.Empty);
}
...这似乎工作得很好。但是,现在我想使用回调函数进一步扩展,但我只有一些线索可以处理这种情况。 (我确信有可能做到这一点,但我相当 lost/confused 关于实际实施...)
类似于:
public delegate void Update_System_Status (bool dbConnected, string textStatus);
...然后稍后(我确定我弄错了,编译器甚至在编译时间之前就标记了它):
if (Update_System_Status != null)
{
Update_System_Status(bConnFlag, sConnTextStatus);
}
我想构建几个回调 - 一个允许数据处理程序 class 通知调用进程它已成功连接(或未连接),另一个用于处理更新进度条较长的批量更新过程。在使用 [callback] and/or [delegate] 作为关键字进行多次搜索之后,我很快就一无所获。然而,我真的感到困惑!
我曾设想我会提供某种接口,与 EventHander(以上)非常相似,并且能够确定 - 稍后,当需要时 - 调用过程是否提供了正确的功能,并调用它 if/when 可能。我知道并不是所有的程序员都想为这个数据库处理程序提供一个主窗体更新回调函数,所以我想我需要以某种方式 "know" 何时提供,何时不提供。
我没有成功地使用 [delegate] 关键字,并且根本不知道如何使用 [interface] 指令 - 我保留 运行 的所有示例都说明了 class,这完全不是我想要达到的目标。我正在尝试提供一个框架,该框架将允许外部进程提供一个函数,当 class/object 内部发生某些事情可以很好地更新外部(调用)系统时,可以通过调用提供的函数来实现(从外面)。
(提前)感谢您的帮助 - 我迷路了!
我认为你的问题是你只声明了一个委托类型 - 你没有声明那种类型的 属性
尝试这样的事情:
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;
您正确声明了委托。您缺少的是此 class 的成员,它将使用该委托声明。您尝试的代码对事件(多播委托)有效,尽管您省略了 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) { ... }