C#事件作为方法中的参数

C#事件作为方法中的参数,c#,events,C#,Events,我想在我的方法中使用事件本身。可能吗? “PlayWithEvent”方法能否使用“EventSource.Test”事件作为参数 public class EventSource { public event EventHandler Test; } class Program { static void Main(string[] args) { EventSource src = new EventSource (); PlayWi

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

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

您的代码不会编译,您只能从与事件相同的类中访问事件的
EventHandler
委托,即使这样,它也将是
null
,除非您实际添加了要调用的事件处理程序。

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


但是请注意,由于
Test
EventSource
范围内使用时解析为基础委托(与外部可访问事件相反),
EventSource
可以将其作为参数传递给外部方法。

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


但是请注意,由于
Test
EventSource
范围内使用时解析为基础委托(与外部可访问事件相反),
EventSource
可以将其作为参数传递给外部方法。

由于您标记了

public event EventHandler Test;
作为一个事件

请删除事件标记,然后重试。现在对我有用了。原因是C#对事件的限制。。。但在代码中,您只需要一个委托。将您的类声明为:

public class EventSource
{
    public EventHandler Test;
}
请注意,我删除了事件:

public EventHandler Test;

它当前不工作,因为您标记了

public event EventHandler Test;
作为一个事件

请删除事件标记,然后重试。现在对我有用了。原因是C#对事件的限制。。。但在代码中,您只需要一个委托。将您的类声明为:

public class EventSource
{
    public EventHandler Test;
}
请注意,我删除了事件:

public EventHandler Test;

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

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);
    }
}
公共接口IEventPublisher,其中T:EventArgs
{
公开无效发布(T参数);
}
公共类事件源:IEventPublisher
{
公共事件事件处理程序测试;
公共无效发布(EventArgs args)
{
测试(本,args);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
EventSource src=新的EventSource();
PlayWithEvent(src);
}
静态void PlayWithEvent(IEventPublisher发布者)
{
publisher.Publish(EventArgs.Empty);
}
}

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

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);
    }
}
公共接口IEventPublisher,其中T:EventArgs
{
公开无效发布(T参数);
}
公共类事件源:IEventPublisher
{
公共事件事件处理程序测试;
公共无效发布(EventArgs args)
{
测试(本,args);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
EventSource src=新的EventSource();
PlayWithEvent(src);
}
静态void PlayWithEvent(IEventPublisher发布者)
{
publisher.Publish(EventArgs.Empty);
}
}