【问题标题】:How to invoke a delegate object如何调用委托对象
【发布时间】:2018-11-11 04:47:29
【问题描述】:

您好,我是 C# 新手,目前正在使用一些 3rd 方 API 开发应用程序。我遇到了两行代码,如果您能提供帮助,我将不胜感激。下面是类似于我的实际示例代码的代码

bank.Account.NewAcc += delegate (Customer customerInfo) {
   Console.WriteLine ("Customer Name : " + customerInfo.Name);
};

bank.Account.NewAcc 是一个事件,而 Customer 是一个类。

以下是问题:

  1. 我们可以创建object 而不是method 的代表吗?

  2. 如何调用它?我没有 API 提供的任何其他信息

非常感谢。

【问题讨论】:

    标签: c# events delegates


    【解决方案1】:
    1. 我不太清楚您所说的“对象”代表是什么意思。我怀疑你可以。委托代表要调用的方法列表。您不能只为它分配任何 object 值。

    2. 不调用(或引发)事件。 API 可以。从NewAcc的名字来看,我猜这个事件会在创建新帐户时引发。尝试对bank.Account 这样做。您可能会看到打印了客户信息。显然,这不会 100% 有效。您必须查看 bank.Account 内部才能确切知道何时引发事件(或者直接询问编写它的人)。

    请注意,可以使用 lambda 表达式编写委托:

    bank.Account.NewAcc += (customerInfo) => Console.WriteLine ("Customer Name : " + customerInfo.Name);
    

    【讨论】:

      【解决方案2】:

      在您的示例代码中,具有 CustomerInfo 类型的单个参数的匿名委托已绑定到名为 NewAcc 的事件。

      一旦NewAcc 事件被触发,绑定的委托就会被执行,触发\引发事件的代码可能是这样的:

      公共类 BankAccount { .....

          protected virtual void OnNewAcc(CustomerInfo customerInfo)
          {
              CustomerEventHandler handler = NewAcc;
              if (handler != null)
              {
                  handler(this, customerInfo);
              }
          }
      
          public event CustomerEventHandler NewAcc;
      

      .... }

      我希望这回答了你的问题。

      【讨论】:

        【解决方案3】:

        请根据我的知识在下面找到您的问题的答案:

        1。我们可以创建对象而不是方法的委托吗?

        没有。你不能。因为委托意味着函数指针。它们只能保存函数的引用。并且方法的签名必须与委托的签名匹配。

        2。我该如何调用它?我没有从 API 提供的任何其他信息

        可以通过两种方式调用作为事件处理程序与事件关联的委托。首先,何时引发事件,其次,当您以编程方式调用事件时。

        【讨论】:

          猜你喜欢
          • 2011-01-19
          • 2017-04-21
          • 2013-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多