【问题标题】:In .NET, is it possible to set Events based on calling of a function在 .NET 中,是否可以根据函数调用来设置事件
【发布时间】:2011-03-30 08:44:55
【问题描述】:

假设我有一个名为:

void AFun()
{
// body
}

是否可以在调用此函数时设置事件。说,

void AnEvent()
{
//body
}

每当调用AFun() 时,总是会调用AnEvent()

【问题讨论】:

    标签: c# .net events function call


    【解决方案1】:

    是的,但间接地,如果您在 AFun 中发出一个事件,并且 AnEvent 将监听该事件,您将实现您想要的。否则你描述的不直接支持

    代码示例:

    public delegate void EventHandler();
    public event EventHandler ev;
    
    public void AFun
    {
       ...do stuff
       ev(); //emit
    }
    
    //somewhere in the ctor
    ev += MyEventHandler;
    
    //finally 
    
    void MyEventHandler
    {
        //handle the event
    }
    

    【讨论】:

    • 能否请您提供代码 sn-p 或资源以及如何设置它们的示例。
    • @Gunner,声明事件并引发它们并监听它们是非常基本的 C#/.NET。请查阅您最喜欢的 C# 入门书籍。
    • 我希望如果可以在不修改 AFun 的情况下这样做,那就是从其他地方进行分配。
    • @Gunner:不,正如我在回答中提到的那样,这是不可能的。
    【解决方案2】:

    不像你写的那样。您所描述的称为“面向方面的编程”(AOP),需要编译器支持。

    现在,C# 和 .NET 的一些扩展通过将侦听器和事件注入代码中的正确位置来执行 AOP。

    题外话:在 JavaScript 中你可以做到这一点。

    【讨论】:

      【解决方案3】:

      简单的方法:

      event EventHandler AnEventHappened;
      
      void AFun()
      {
         OnAnEvent();
      }
      
      void AnEvent()
      {
      
      }
      
      void OnAnEvent()
      {
        var tmp = AnEventHappened;
        if(tmp != null) tmp(this, EventArgs.Empty);
      }
      

      【讨论】:

      • 那不会编译,是吗? (我猜它会失败并显示“无法从 EventHandler 转换为布尔值”的消息)
      • @Fred:抱歉 - javascript 太多了。旨在测试 null。
      【解决方案4】:

      艰难的路:

      使用面向方面的编程(使用诸如 Castle 或 PostSharp 之类的东西)并以这种方式发出事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-17
        • 2019-04-20
        • 1970-01-01
        • 2013-06-20
        • 2016-08-14
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        相关资源
        最近更新 更多