在派生类中触发事件处理程序

4

有人能提供解决方案吗?

public class BaseOne{
    public event EventHandler OperationChanged;
}

public class Derived: BaseOne
{
    private void OnChange(){
        if(OperationChanged!=null){
            OperationChanged(this,new EventArgs());
        }
    }
}

public Class MainClass
{
    public void Main()
    {
        Derived d = new Derived();
        d.OperationChanged += OnOperationChange;
    }

    private void OnOperationChange(object sender, EventArgs e)
    {
        MessageBox("Hello I'm Called");
    }
}

我尝试了这样做,你能否建议更好的方法?提前感谢 :)

你已经尝试过了,不起作用吗?在我看来,这段代码完全没有问题... - Ian
你想要实现什么?你想用它做什么?或者换句话说,有什么问题吗? - Angloos
你拼错了OnChnage!!! - jdweng
1
首先,您不能直接触发基类事件。其次,请将您的方法从私有更改为受保护的。这里是相关内容的链接:https://msdn.microsoft.com/zh-cn/library/hy3sefw3(v=vs.120).aspx - Angloos
感谢大家,特别是@Angloos,我现在已经有了解决方法。谢谢你们的帮助。 :) - Naveen Bathina
显示剩余4条评论
2个回答

5
您不能直接触发基类事件。
有一个有用的模式可以实现这个功能。
using System;

class Base
{
    public event EventHandler operationsChanged;
    public void OnOperationsChanged(EventArgs e)
    {
        operationsChanged(this,e);
    }
}
class Derived : Base
{
    public void OnSpecificOperationChanged()
    {
        OnOperationsChanged(EventArgs.Empty);
    }
}
class Test
{
    static void  Main()
    {
        Derived d = new Derived();
        d.operationsChanged += OnOperationsChanged;

        //invoke
        d.OnSpecificOperationChanged();

    }
    static void OnOperationsChanged(object sender, EventArgs e)
    {
        Console.WriteLine("called");
    }
}

https://msdn.microsoft.com/en-us/library/hy3sefw3.aspx


谢谢您的回答。我们能否进行优化/是否有其他解决方案? - Naveen Bathina
我不知道有任何的。 - Acha Bill

-1
我找到了一个新的解决方案。简单的解决方案是将字段变成属性...
using System;

class Base
{
    public event EventHandler OperationsChanged {get; set;}
}
class Derived : Base
{
   public void OnSpecificOperationChanged()
   {
        OperationsChanged(this, EventArgs.Empty);
   }
}

class Test
{
    static void  Main()
    {
        Derived d = new Derived();
       d.OperationsChanged += OnOperationsChanged;

       //invoke
       d.OnSpecificOperationChanged();

    } 
    static void OnOperationsChanged(object sender, EventArgs e)
    {
        Console.WriteLine("called");
    }
}

{get; set;}:需要添加或删除访问器。 - rhavin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接