事件处理C#/注册回调

时间:2010-04-01 04:32:17

标签: c# .net callback delegates

事件只能返回void并收到对象sender / eventargs吗?

如果是,那么craptastic ....我怎样才能将函数指针传递给另一个obj,如:

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

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

Something::GiveCallBack(Action? funcPtr)

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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您需要创建一个传递您感兴趣的类的委托

public delegate void CallbackDelegate(s s); 公共事件CallbackDelegate myCallback

public void myFunction() {   if(myCallback!= null)     myCallback(new something()); }

查看msdn教程... http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx

答案 2 :(得分:0)

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

如果你想让它返回值,请使用Func,或者如果你只想让它返回bool并取一个参数,你可以使用谓词

或者您可以定义一个委托,无论如何您想要返回void或值并接受任意数量的参数。您可以定义如下所示的委托,它就像您可以使用的类型。然后,您可以直接将其作为回调参数传递,而无需使用Action,Func或Predicate。自定义委托也常用于编写自定义多播事件处理程序。

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

答案 3 :(得分:0)

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

解决此问题的一些想法是将引用对象传递给事件处理程序,以保持对该对象的引用。你可以获得结果,但是你需要另一个事件才能知道对象何时被更改。但重新考虑你想要完成的任何事情可能是一个更好的主意。当你最终陷入无限循环的事件导致改变然后引发事件时,这听起来像堆栈溢出的配方。