微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何将场景中的事件附加到另一个类

假设我的Facade类有两个子系统类.每个子系统都有不同的事件

FacadeClass是

public class FacadeClass
{
    private SubsystemClass1 _s1;
    private SubsystemClass2 _s2;

    public FacadeClass() 
    {
        _s1 = new SubsystemClass1();
        _s2 = new SubsystemClass2();
    }
}

和SubsystemClass1

public class SubsystemClass1
{
    public event EventHandler FetchComplete;

    public void OnFetchComplete(EventArgs e)
    {
        if (FetchComplete != null)
        {
            FetchComplete(this,e);
        }
    }
}

然后是SubsystemClass2

public class SubsystemClass2
{
    public event EventHandler SendComplete;

    public void OnSendComplete(EventArgs e)
    {
        if (SendComplete != null)
        {
            SendComplete(this,e);
        }
    }
}

假设我有一个使用facade类的类,我想从SubsystemClass1和SubsystemClass2附加事件.问题是如何在没有使用子系统类(如果有的话)的情况下在没有redifine的情况下附加事件?

在外观类中重新设置它的示例

public class FacadeClass
{
    private SubsystemClass1 _s1;
    private SubsystemClass2 _s2;

    public FacadeClass() 
    {
        _s1 = new SubsystemClass1();
        _s2 = new SubsystemClass2();
    }

    // Redifine the event
    public event EventHandler FetchComplete
    {
        add { _s1.FetchComplete += value; }
        remove { _s1.FetchComplete -= value; }
    }

    public event EventHandler SendComplete
    {
        add { _s2.SendComplete += value; }
        remove { _s2.SendComplete -= value; }
    }
}

使用子系统类的示例,使它们都是公共的

public class FacadeClass
{
    // Make both class to public
    public SubsystemClass1 _s1;
    public SubsystemClass2 _s2;

    public FacadeClass() 
    {
        _s1 = new SubsystemClass1();
        _s2 = new SubsystemClass2();
    }
}

public class AnotherClass
{
    FacadeClass _fd;

    public AnotherClass() 
    {
        _fd = new FacadeClass();
        // Little bit ugly
        _fd._s1.FetchComplete += new EventHandler(_s1_FetchComplete);
    }

    void _s1_FetchComplete(object sender,EventArgs e)
    {
        // Do Something Here
    }
}

提前致谢,

对Brian说…

解决方法

你的事件包装解决方案似乎对我很好.这有什么问题?在某种程度上,您将不得不指定SubSystemClass或在FacadeClass上添加某种包装器.因为SubSystemClasses是私有的,所以除非你向FacadeClass添加一些代码,否则无法访问事件.我能想到的唯一另一个选择是反思,这可能是一个可行的解决方案.

编辑:我不知道这是否与想要暴露s1或s2的属性的情况有任何不同.如果你想这样做,你需要公开s1 / s2,提供包装属性或使用反射.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐