C#Events作为方法中的参数

时间:2011-04-17 17:43:16

标签: c# events

我想在我的方法中使用事件本身。可能吗? “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 个答案:

答案 0 :(得分:2)

您的代码无法编译 - 您只能在与事件相同的类中访问该事件的EventHandler委托,即使这样,它也会null,除非您实际添加了一个事件处理程序来调用。

答案 1 :(得分:2)

由于您已标记

,因此目前无效
public event EventHandler Test;

作为一个事件。

删除事件代码,然后重试。它现在适合我。原因是C#对事件的限制......但是在你的代码中,你想要的只是一个委托。将您的班级声明为:

public class EventSource
{
    public EventHandler Test;
}

请注意,我删除了活动:

public EventHandler Test;

答案 2 :(得分:1)

你不能这样做。你需要通过实际的课程。

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);
    }
}

答案 3 :(得分:0)

只有定义了事件的类才能引发事件。如果您需要其他类来操作它,则必须使用常规委托。

但请注意,由于TestEventSource范围内使用(而不是外部可访问的事件)时,EventSource解析为基础委托,{{1}} 可以< / em>将其作为参数传递给外部方法。