1

我一直在寻找几天来解决 C 或 C++ 中的一个琐碎问题,但在 C# 中似乎不可能。

另一个程序员创建了A类。A类中的一个事件处理程序方法需要调用我B类中的一个方法来处理事件。根据事件的类型,B 类中的方法需要回调 A 类中的方法,并且该方法具有任意名称,甚至可能不存在。

这在 C 中很简单;您只有一个指向回调函数的指针,如果它不为空,则间接调用它。我不知道如何在 C# 中进行间接方法调用。这是一些说明问题的代码示例。

public class A: ZZZ { // this class is NOT under my control
   private b = new B(this);

   public void myCallback(C x) {
      // do something
   }

   // Elsewhere in the application expects a protected
   // override method to exist in *this* class A to handle
   // an event. But we want a method in class B to handle
   // it and then call myCallback depending on the type of event

   protected override void handle_some_event(event e) {
      // doesn't work -- how do I pass a "pointer" to the callback??
      b.handle_event(e, myCallback);
   }
}


public class B {    // this class IS under my control
   private A base;

    public B(A a) {
       base = a; // allows for calling methods in class A from class B
    }

    public handle_event(event e, ??? callback pointer ??? cback) {
       // do stuff...
       // then do the callback
       // cback(); // this won't work
       base.myCallback(); // this WILL work but only if I hard-code "myCallback"
    }    
}

问题是 B 类是我正在编写的,而 A 类是由将使用我的 B 类的其他人编写的。其他人可以选择根本不定义回调,或者创建一个任意的回调姓名。B 类需要以某种方式知道那是什么以及如何访问它。在 C 或 C++ 中,其他程序员可以简单地将指针传递给他的回调函数。这在 C# 中可能吗?

4

3 回答 3

2

您想将 an 传递Action<T>handle_some_event您可以这样做:

public handle_some_event(event e, Action<C> cback) 
{
   // Do stuff
   if(cback != null)
       cback(myC);
}

class B实际上根本不需要了解任何关于 的信息class A,它只需要一个 Action 委托来执行,其余的无关紧要。

于 2012-06-19T01:57:41.957 回答
0

这是我最终得到的解决方案,基于我最初帖子中的代码

public class A: ZZZ { // this class is NOT under my control
   private b = new B(this);
   b.UserCallback = myCallback;

   static void myCallback(C x) {
      // do something
   }

   // Elsewhere in the application expects a protected
   // override method to exist in *this* class A to handle
   // an event. But we want a method in class B to handle
   // it and then call myCallback depending on the type of event

   protected override void handle_some_event(event e) {
      b.handle_event(e);
   }
}

public delegate void usercallback(Z z); // declare OUTSIDE both classes

public class B {    // this class IS under my control
   public usercallback UserCallback = defaultCallback;
   static void defaultCallback(Z z) { /* do nothing */ }

   public handle_event(event e) {
       // do stuff...
       // then do the callback
       UserCallback(z);
   }    
}

让我停留了一段时间的原因是,我的脑袋被这样一个事实包围了:委托声明类似于 C 函数原型,并且委托可以用作类中的声明类型。

于 2012-06-22T00:16:39.010 回答
0

您可以使用 Action 委托来引用回调。

检查此 URL 以获取更多信息:http: //msdn.microsoft.com/en-us/library/018hxwa8.aspx

将您的 B 类更改为: public class B { private A base;

    public B(A a) {
       base = a; // allows for calling methods in class A from class B
    }

   //#################### NOTE THE CHANGE HERE ##################//
    public handle_some_event(event e, Action<C> cback) {
       // do stuff...
       // then do the callback
       cback(x); // this will work assuming you have x defined somewhere in B
    }    
}
于 2012-06-19T01:55:02.317 回答