Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从封装的类传递事件_C#_Events_Encapsulation - Fatal编程技术网

C# 从封装的类传递事件

C# 从封装的类传递事件,c#,events,encapsulation,C#,Events,Encapsulation,如果我有一个封装了类B实例的类a,那么有可能通过类a的实例传递在类B中引发的事件吗?例如: public classB { ... public event EventArgs SomeEvent; protected virtual void OnSomeEvent(EventArgs e) ... } public classA { ... private classB = new ClassB(); ... } 我希望发生的是,类

如果我有一个封装了类B实例的类a,那么有可能通过类a的实例传递在类B中引发的事件吗?例如:

public classB
{
    ...
    public event EventArgs SomeEvent;
    protected virtual void OnSomeEvent(EventArgs e)
    ...
}

public classA
{
    ...
    private classB = new ClassB();
    ...
}
我希望发生的是,类A的任何实例也会公开某个事件,当它由类B引发时,它由类A引发

有人能提供帮助或建议吗?

简单的课程没有什么比这更好的。当ClassB引发事件时,您应该订阅ClassB事件并从ClassA引发事件:

public class ClassA
{
    public event EventHandler SomeEvent = (s,e) => { };
    private ClassB classB = new ClassB();

    public ClassA()
    {
       classB.SomeEvent += (s,e) => SomeEvent(this, e);
    }    
}
更经典的方式:

public ClassA
{
    public event EventHandler SomeEvent;
    private ClassB classB = new ClassB();

    public ClassA()
    {
       classB.SomeEvent += ClassB_SomeEvent;
    }

    private void ClassB_SomeEvent(object sender, EventArgs e)
    {
        if (SomeEvent != null)
            SomeEvent(this, e);
    }
}

另一个选项是将事件委托给原始类:

public class ClassA
{
    private ClassB classB = new ClassB();
    public event EventHandler SomeEvent
    {
        add
        {
            classB.SomeEvent += value;
        }
        remove
        {
            classB.SomeEvent -= value;
        }
    }
}
这意味着当在
ClassB
中引发事件时,
ClassA.SomeEvent
的所有订阅者也将收到通知,因为他们实际上订阅了
ClassB.SomeEvent
。我不确定这是否是您真正想要的,但在任何情况下,您都可以使用subscribe和raise方法


不过这里有一个陷阱:
sender
对象将是
ClassB
的一个实例,而不是
ClassA
,这意味着您不能在WPF with
INotifyDataErrorInfo
验证中委托事件,例如,视图模型本身将引发验证事件。然后您只需订阅并筹集资金。

谢谢您的帮助!这正是我想要的。谢谢你的回复。这是非常有价值的信息。