6

我无法弄清楚如何在 C# 中跨类对委托方法调用进行编程。我来自 Objective-C 的世界,这可能让我感到困惑。在 Objective-C 中,我可以在子类中分配一个委托对象,作为父类(即,childViewcontroller.delegate = self;)。然后我可以使用以下方法在委托类中触发一个方法:

if([delegate respondsToSelector:@selector(methodName:)]) {
   [delegate methodName:parametersgohere];
}

但是,我无法弄清楚如何在 C# 中执行此操作。我已经阅读了一些关于 C# 委托的一般信息(例如,这里),但我仍然卡住了。

有没有例子可以解释这一点?

这是我的完整场景: 我有 classA 实例化 classB 的实例。ClassB 触发一个方法(调用 Web 服务),在响应时,我想触发 classA 中的一个方法。

有任何“Hello World”类型的教程可以解释这个的基础知识吗?

4

2 回答 2

6

委托是指向方法的对象,无论是静态方法还是实例方法。因此,对于您的示例,您只需使用事件模型:

class Caller {
    public void Call() {
        new Callee().DoSomething(this.Callback); // Pass in a delegate of this instance
    }

    public void Callback() {
        Console.WriteLine("Callback called!");
    }
}

class Callee {
    public void DoSomething(Action callback) {
        // Do stuff
        callback(); // Call the callback
    }
}

...

new Caller().Call(); // Callback called!

实例将Caller委托传递给Callee实例的DoSomething方法,该方法又调用指向的方法,即实例的Callback方法Caller

于 2012-04-10T18:34:37.877 回答
4

在 C# 中,我认为您正在寻找的东西称为事件。它们是一种语言功能,允许类实例以其他类实例可以订阅的方式公开公共委托。只允许暴露类引发事件。

在您的示例中:

public class ClassB {
    // Note the syntax at the end here- the "(s, e) => { }" 
    // assigns a no-op listener so that you don't have to 
    // check the event for null before raising it.
    public event EventHandler<MyEventArgs> MyEvent = (s, e) => { }

    public void DoMyWork() { 
        // Do whatever

        // Then notify listeners that the event was fired
        MyEvent(this, new MyEventArgs(myWorkResult));
    }
}

public class ClassA {
    public ClassA(ClassB worker) {
        // Attach to worker's event
        worker.MyEvent += MyEventHandler;

        // If you want to detach later, use
        // worker.MyEvent -= MyEventHandler;
    }

    void MyEventHandler(Object sender, MyEventArgs e) {
        // This will get fired when B's event is raised
    }
}

public class MyEventArgs : EventArgs {
    public String MyWorkResult { get; private set; }
    public MyEventArgs(String myWorkResult) { MyWorkResult = myWorkResult; }
}

请注意,以上将是同步的。我的理解是Objective-C委托都是Actor模式,所以它们是异步的。要使上述异步,您需要深入研究线程(可能想要谷歌“C#线程池”)。

于 2012-04-10T18:32:19.877 回答