Добавить событие в другое событие?C # - PullRequest
2 голосов
/ 03 февраля 2011
class a 
{
    public event Action foo;
    var zzz = new b();
    foo += zzz.bar;
}

class b 
{
    public Action bar;
}

Приведенный выше (псевдо) код работает и прекрасно компилируется.

Однако, если я изменю bar на public event Action bar, я не могу добавить его к foo. В основном я хотел бы добавить одно событие к другому. Я знаю, что это может звучать смешно.

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

IIRC вы не можете напрямую вызывать события из другого класса.

class A {
    public A() {
        b = new B(this);
    }

    private B b;
    public event Action Foo;
}

class B {
    public B(A a) {
        a.Foo += InvokeBar;
    }

    public event Action Bar;

    private void InvokeBar() {
        if (Bar != null)
            Bar();
    }
}
1 голос
/ 03 февраля 2011

Чего вы хотите добиться, так это (я думаю):

  1. foo событие запущено:
    вызов всех foo подписчиков обработчиков событий плюс все barподписанные обработчики событий.
  2. bar сработало:
    вызов всех bar подписанных обработчиков событий плюс все foo подписанные обработчики событий.

class a 
{
    public event Action foo;
    b zzz = new b();
    public a()
    {
        // this allow you to achieve point (1)
        foo += zzz.FireBarEvent;
        // this allow you to achieve point (2)
        zzz.bar += OnBar;
    }
    void OnBar()
    {
        FireFooEvent();
    }
    void FireFooEvent()
    {
        if(foo != null)
            foo();
    }
}

class b 
{
    public event Action bar;
    public void FireBarEvent()
    {
       if(bar != null)
           bar();
    }
}

CAVEAT:

этот код (если обе опции (1) и (2) включены) вызывают бесконечное количество вызовов, то есть:

foo --> bar --> foo --> bar ...

, который имеетбыть управляемым должным образом.

1 голос
/ 03 февраля 2011

Если bar является публичным событием, вы используете лямбду для вызова события bar:

foo += () => zzz.bar();

Это не точный синтаксис, исследование ...

Это невозможно, потому что вы не можете вызвать событие bar вне класса, в котором оно определено.

Вы должны использовать решение, подобное этому;

class b {
    public Action bar;
    public void InvokeBar() {
       if (bar != null) bar();
    }
}

Тогда вы можете использовать InvokeBar в качестве цели для вашего события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...