Подписка на события в отдельном классе - PullRequest
2 голосов
/ 19 июня 2009

У меня проблемы с подпиской на событие, которое я создал. Само событие находится в своем собственном классе, и я хочу иметь возможность подписаться на него из отдельного класса в отдельном проекте. Я могу подписаться на него из класса, в котором он создан, но когда я пытаюсь подписаться из другого класса в другом проекте, ничего не происходит.

Может ли кто-нибудь дать мне несколько советов о том, как я могу работать через это вообще? Я весь Google пытался найти решение, но безрезультатно: (.

Ответы [ 4 ]

6 голосов
/ 19 июня 2009

Вот простой пример события, на которое я создал и подписался:

using System;

class Program
{
    static void Main()
    {
        Foo foo = new Foo();
        foo.Fooing += () => Console.WriteLine("Foo foo'd");

        foo.PleaseRaiseFoo();
    }
}

class Foo
{
    public event Action Fooing;

    protected void OnFooing()
    {
        if (this.Fooing != null)
            this.Fooing();
    }

    public void PleaseRaiseFoo()
    {
        this.OnFooing();
    }
}

Надеюсь, это сможет указать вам правильное направление. Основные вещи, которые нужно проверить в своем коде:

  • Ваше мероприятие помечено как публичное?
  • Вы когда-нибудь поднимали событие? (например, this.Fooing())
1 голос
/ 19 июня 2009

Я только что попробовал ваш пример кода с делегатом EventHandler вместо Action (так как не смог найти не универсальный делегат Action в пространстве имен System)

Приведенный ниже код работает так, как вы и ожидаете: выводит «Foo foo'd».

Может быть, это делегат Action, хотя я нахожу это несколько странным.

class Program
{
    static void Main()
    {
        Foo foo = new Foo();
        foo.Fooing += (object o, EventArgs e) => Console.WriteLine("Foo foo'd");

        foo.PleaseRaiseFoo();
    }
}

class Foo
{
    public event EventHandler Fooing;

    protected void OnFooing()
    {
        if (this.Fooing != null)
            this.Fooing(null, null);
    }

    public void PleaseRaiseFoo()
    {
        this.OnFooing();
    }
}
0 голосов
/ 19 июня 2009

Вы заметили, что ваш класс находится в другом проекте, вы видите класс событий (или любой другой класс в этом проекте)? Возможно, вы не ссылались на другой проект должным образом.

0 голосов
/ 19 июня 2009

Вы пробовали это?

MyInstanceOfMyClass.MyEvent += new EventHandler(MyDelegate);
protected void MyDelegate(object sender, EventArgs e) { ... }
...