如何从类构造函数捕获事件触发器

时间:2017-01-27 13:08:31

标签: c# events constructor

这是一个例子......

public class CodeGenerator
{
     public delegate void GeneratorCalculatorEventHandler(decimal Fond);
     public event GeneratorCalculatorEventHandler eventName;

     public CodeGenerator()
     {
          eventName?.Invoke(0);
     }
}

我怎么能抓住这个事件?如果我这样做:

CodeGenerator CodeGen = new CodeGenerator();
CodeGen.eventName     += CodeGen_eventName;

当处理程序尚未订阅它时会触发该事件。是否可以订阅初始化事件?

2 个答案:

答案 0 :(得分:7)

正如评论所说,这是一个糟糕的代码味道。听起来你在这里做了一些非常不寻常的事情,你应该考虑尝试找到一种不同的方法来解决你的问题。

它闻起来很糟糕的原因之一是:如果调用代码知道将处理程序传递给构造函数,那么该代码已经知道正在调用构造函数。调用者只需调用处理程序本身与构造的实例!事件通常用于处理程序无法预测或控制的事情,例如用户单击按钮。

我不会将处理程序传递给构造函数,我是否在你的情况下。我会使用静态事件。

答案 1 :(得分:1)

您应该将处理程序传递给构造函数并将其附加到事件,例如:

public class CodeGenerator
{
    public delegate void GeneratorCalculatorEventHandler(decimal Fond);
    public event GeneratorCalculatorEventHandler eventName;

    public CodeGenerator(GeneratorCalculatorEventHandler listener)
    {
        eventName += listener;
        eventName?.Invoke(0);
    }
}

public class Test
{
    public Test()
    {
        CodeGenerator gen = new CodeGenerator((sen) => { return; });
    }
}