从另一个类调用委托方法

Posted

技术标签:

【中文标题】从另一个类调用委托方法【英文标题】:Call Delegate methods from another class 【发布时间】:2012-04-10 18:24:09 【问题描述】:

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

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

但是,我不知道如何在 C# 中执行此操作。我已经阅读了一些关于 C# 委托的一般信息(例如,here),但我仍然卡住了。

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

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

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

【问题讨论】:

请注意,C#/.NET 委托与 Objective-C/Cocoa 委托完全不同。 @BoltClock'saUnicorn:是的,我认为这就是我的错误所在。但我仍然想弄清楚如何复制上述场景。 :-) “代表”一词有很多含义。在 C# 中,它的意思是“表示函数指针的对象”。我不确定这对你意味着什么。 当你说“我想触发 classA 中的一个方法”时,你如何期望 classB 知道要调用 classA 中的哪个方法? @Gabe,这就是我想要弄清楚的。我怎么能告诉它用什么方法开火?那我怎么开火呢? 【参考方案1】:

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

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 方法,该方法又调用指向的方法,即Caller 实例的Callback 方法。

【讨论】:

【参考方案2】:

在 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模式,所以它们是异步的。要实现上述异步,您需要深入研究线程(可能想在 Google 上搜索“C# 线程池”)。

【讨论】:

我认为 OP 需要 A 和 B 相反 ;) B 是孩子,B “调用” A 方法(所以 B 引发事件,A 订阅它) 可能——在这种情况下,我怀疑他是否能弄清楚如何扭转这种模式。

以上是关于从另一个类调用委托方法的主要内容,如果未能解决你的问题,请参考以下文章

Rails:从另一个模型调用或委托实例方法

从另一个类调用选择器的 UIGestureRecognizer

UIGestureRecognizer,从另一个类调用选择器

如何从另一个类调用@selector 方法

如何从另一个类调用方法函数?

从另一个类调用方法,uiwebview 和模态视图问题