События C # как параметр в методе - PullRequest
1 голос
/ 17 апреля 2011

Я хочу использовать само событие в моем методе.Является ли это возможным?Может ли метод "PlayWithEvent" использовать событие "EventSource.Test" в качестве параметра?

public class EventSource
{
    public event EventHandler Test;
}

class Program
{
    static void Main(string[] args)
    {
        EventSource src = new EventSource ();
        PlayWithEvent (src.Test);
    }

    static void PlayWithEvent (EventHandler e)
    {
        e (null, null);
    }
}

Мне нужен следующий синтаксис:

class Program
    {
        static void Main(string[] args)
        {
            EventSource src = new EventSource ();
            PlayWithEvent (src.Test);
        }

        static void PlayWithEvent (event e)
        {
            e += something;
        }
    }

Ответы [ 4 ]

2 голосов
/ 17 апреля 2011

В настоящее время он не работает, потому что вы отметили

public event EventHandler Test;

как событие.

Удалите тег события и попробуйте снова. Теперь это работает для меня. Причиной этого являются ограничения, которые C # имеет для событий ... Но в вашем коде все, что вам нужно, это делегат. Объявите свой класс как:

public class EventSource
{
    public EventHandler Test;
}

Обратите внимание, что я удалил событие:

public EventHandler Test;
2 голосов
/ 17 апреля 2011

Ваш код не будет компилироваться - вы можете получить доступ к делегату EventHandler для события только из того же класса, что и событие, и даже тогда это будет null, если вы на самом деле не добавите обработчик события для вызова.

1 голос
/ 17 апреля 2011

Вы не можете так делать. Вам нужно пройти реальный класс.

public class EventSource
{
    public event EventHandler Test;

    public void TriggerEvent()
    {
       Test(this, EventArgs.Empty);

    }
}

class Program
{
    static void Main(string[] args)
    {
        EventSource src = new EventSource ();
        PlayWithEvent (src);
    }

    static void PlayWithEvent (EventSource e)
    {
       src.TriggerEvent();
    }
}

Вы можете сделать это более общим способом, введя интерфейс:

public interface IEventPublisher<T> where T : EventArgs
{
    public void Publish(T args);
}


public class EventSource : IEventPublisher<EventArgs>
{
    public event EventHandler Test;

    public void Publish(EventArgs args)
    {
       Test(this, args);
    }
}

class Program
{
    static void Main(string[] args)
    {
        EventSource src = new EventSource ();
        PlayWithEvent (src);
    }

    static void PlayWithEvent (IEventPublisher<EventArgs> publisher)
    {
       publisher.Publish(EventArgs.Empty);
    }
}
0 голосов
/ 17 апреля 2011

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

Обратите внимание, однако, что, поскольку Test разрешается в базовый делегат при использовании в области действия EventSource (в отличие от события, доступного извне), EventSource может передать его как параметр для внешнего метода.

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