Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
事件处理C#/注册回调_C#_.net_Callback_Delegates - Fatal编程技术网

事件处理C#/注册回调

事件处理C#/注册回调,c#,.net,callback,delegates,C#,.net,Callback,Delegates,事件只能返回void和receive object sender/eventargs,对吗 如果是这样,那就糟透了。。。。如何将函数指针传递给另一个obj,如: public bool ACallBackFunc(int n) { return n > 0; } public void RegisterCallback(Something s) { s.GiveCallBack(this.ACallBackFunc); } Something::GiveCallBa

事件只能返回void和receive object sender/eventargs,对吗

如果是这样,那就糟透了。。。。如何将函数指针传递给另一个obj,如:

public bool ACallBackFunc(int n) 
{
    return n > 0;
}

public void RegisterCallback(Something s)
{
     s.GiveCallBack(this.ACallBackFunc);
}

Something::GiveCallBack(Action? funcPtr)

我尝试使用
Action
,但我需要它返回一些值,
Action
s只能返回void。另外,我们不知道我们将收到什么样的回调;它可以返回任何东西,并且有任何参数!我认为,必须以某种方式使用反射。

我编写了返回值的事件,通常是
bool
。但是,使用将允许返回值。

我编写了返回值的事件,通常是
bool
。但是,使用将允许返回值。

您需要创建一个委托,将您感兴趣的类传回

公共委托无效回调委托(s); 公共事件回调委托myCallback

公共函数() { if(myCallback!=null) myCallback(newsomething()); }


查看msdn教程

您需要创建一个委托,将感兴趣的类传回给您

公共委托无效回调委托(s); 公共事件回调委托myCallback

公共函数() { if(myCallback!=null) myCallback(newsomething()); }


查看msdn教程

操作按定义不返回值,您可以使用允许多个参数的通用版本

若您希望它返回值,请使用Func,或者若您只希望它返回bool并接受一个参数,则可以使用谓词

或者,您可以以任何方式定义委托,以返回void或值并接受任意数量的参数。您可以像下面这样定义一个委托,它就像您可以使用的类型。然后,您可以直接将其作为回调参数传入,而无需使用Action、Func或谓词。自定义委托也通常用于编写自定义多播事件处理程序

public delegate double PerformAverageEventHandler(int val1, int val2, int val3);

Action by definition不返回值,您可以使用允许多个参数的通用版本

若您希望它返回值,请使用Func,或者若您只希望它返回bool并接受一个参数,则可以使用谓词

或者,您可以以任何方式定义委托,以返回void或值并接受任意数量的参数。您可以像下面这样定义一个委托,它就像您可以使用的类型。然后,您可以直接将其作为回调参数传入,而无需使用Action、Func或谓词。自定义委托也通常用于编写自定义多播事件处理程序

public delegate double PerformAverageEventHandler(int val1, int val2, int val3);

也许您没有意识到一个事件是一个允许多个监听器访问该事件的多播委托。这将使您(可能)需要接收多个返回值


解决这个问题的一些方法是将引用对象传递给事件处理程序,并保留对该对象的引用。您可以获得结果,但需要另一个事件才能知道对象何时更改。但是,重新思考你想要实现的目标可能是一个更好的主意。这听起来像是在事件的无休止循环中导致堆栈溢出,导致更改,然后引发事件。

也许您没有意识到事件是允许多个侦听器参与事件的多播委托。这将使您(可能)需要接收多个返回值


解决这个问题的一些方法是将引用对象传递给事件处理程序,并保留对该对象的引用。您可以获得结果,但需要另一个事件才能知道对象何时更改。但是,重新思考你想要实现的目标可能是一个更好的主意。这听起来像是在事件的无休止循环中导致堆栈溢出,导致更改,然后引发事件。

一个示例可以澄清您的意思。Func似乎需要提前知道返回类型。。。我们可能正在注册未知类型的函数返回值。请尝试
Func
。它获取任意数量的任意类型的参数(通过对象数组,如使用
params
关键字时),并返回任意类型的参数。示例将阐明您的含义。Func似乎需要提前知道返回类型。。。我们可能正在注册未知类型的函数返回值。请尝试
Func
。它获取任意数量的任意类型的参数(通过对象数组,如使用
params
关键字时),并返回任意类型的参数。