C#事件作为方法中的参数
我想在我的方法中使用事件本身。可能吗? “PlayWithEvent”方法能否使用“EventSource.Test”事件作为参数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
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);
}
}