2010-04-01 52 views
1

事件只能返回void并接收对象sender/eventargs吗?事件处理C#/注册回调

如果是这样那么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。另外,我们不知道我们会收到什么样的回调;它可以返回任何东西,并有任何参数!反思将不得不以某种方式使用我认为。

回答

0

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

+0

一个例子可以阐明你的意思。 – 2010-04-01 04:39:20

+0

Func <>看起来我需要提前知道返回类型......我们可能会注册一个未知类型的函数返回值。 – 2010-04-01 04:41:50

+0

尝试'Func '。它可以获取任意类型的任意数量的参数(通过对象数组,例如当使用'params'关键字时)并返回任何类型的参数。 – 2010-04-26 09:04:54

0

你需要创建一个传回的类委托你感兴趣

公众委托无效CallbackDelegate(东西或多个); 公共事件CallbackDelegate myCallBack函数

公共无效myFunction的(){ 如果 (!myCallBack函数= NULL) myCallBack函数(新的东西()); }

退房MSDN教程... http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx

0

行动的定义没有返回值,你可以使用通用的版本,它允许多个参数。

如果你想它的返回值,使用Func键或者如果你只是想它返回布尔和一个参数,你可以使用谓词

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

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

也许你没有意识到一个事件是一个允许多个事件监听器的多播委托。这会让您(潜在地)需要接收多个返回值。

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

相关问题