如何在C#中处理来自事件委托的返回值?
所以我自己也很好奇,因为我越是开发从事件中获取数据的更多用途,所以我四处看了看,发现在处理事件代表的响应方面没有太多的信息 有一个具有返回值的委托,并执行所述委托的方法,并获取其返回值是一回事,但是当一个事件引发大量委托时,您该怎么办?您如何确定每个学员的情况?如何在C#中处理来自事件委托的返回值?,c#,events,delegates,return-value,C#,Events,Delegates,Return Value,所以我自己也很好奇,因为我越是开发从事件中获取数据的更多用途,所以我四处看了看,发现在处理事件代表的响应方面没有太多的信息 有一个具有返回值的委托,并执行所述委托的方法,并获取其返回值是一回事,但是当一个事件引发大量委托时,您该怎么办?您如何确定每个学员的情况? 问答式- 因为关于这个主题的内容太少,而且内容太多样化,所以我选择了一些风格鲜明的东西——我认为这是一个相当彻底的“事件响应处理程序” 在下面的代码示例中(我刚刚用最新的格式副本更新了该示例(很可能还会更新),您将发现支持触发事件以及
- 问答式-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MyNamespace.Events
{
public class EventDriver : IDisposable
{
#region Supporting Events
public List<EventResponse> FireEvent(String EventName, Event Event)
{
List<EventResponse> ResponseList = new List<EventResponse>();
Type LocalType = this.GetType();
Type TargetType = null;
if ((TargetType = this.FindEventType(LocalType, EventName)) == null)
{
return ResponseList;
}
else
{
FieldInfo TargetField = TargetType.GetField(EventName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
MulticastDelegate EventDelegates = (MulticastDelegate) TargetField.GetValue(this);
if (EventDelegates == null)
{
return ResponseList;
}
else
{
foreach (Delegate TargetDelegate in EventDelegates.GetInvocationList())
{
try
{
Object DelegateResponse = TargetDelegate.DynamicInvoke(new Object[] { Event });
EventResponse Response = (EventResponse)DelegateResponse;
ResponseList.Add(Response);
}
catch (Exception e)
{
}
}
return ResponseList;
}
}
}
private Type FindEventType(Type RootType, String EventName)
{
if (RootType == null)
{
return null;
}
else if (String.IsNullOrEmpty(EventName))
{
return null;
}
else
{
FieldInfo EventField = null;
foreach (FieldInfo Method in RootType.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
if (Method.Name == EventName)
{
EventField = Method;
break;
}
if (EventField == null)
{
if (RootType.BaseType == null)
return null;
else
return this.FindEventType(RootType.BaseType, EventName);
}
else
{
return RootType;
}
}
}
#endregion
#region Dispoability
public virtual void Dispose()
{
this.FireEvent("OnDispose", new Event(this, "Object is being disposed."));
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Reflection;
namespace MyNamespace.Events
{
#region Delegates
public delegate EventResponse EventHandler(Event Event);
#endregion
#region Enumerations
public enum EventResponseType
{
Success, Failure
}
#endregion
public class Event
{
#region Events
public event EventHandler OnResponseFailure = null;
#endregion
#region Fields
public Object EventSource = null;
public DateTime EventTime = DateTime.Now;
public String EventMessage = String.Empty;
protected StackTrace _EventStackTrace = null;
public StackTrace EventStackTrace
{
get
{
return this._EventStackTrace;
}
}
protected List<EventResponse> _EventResponses = null;
public List<EventResponse> EventResponses
{
get
{
List<EventResponse> EventResponses = new List<EventResponse>();
lock (this._EventResponses)
{
foreach (EventResponse Response in this._EventResponses)
EventResponses.Add(Response);
}
return EventResponses;
}
}
public Boolean HasFailedResponses
{
get
{
if (this.FailedResponses.Count > 0)
return true;
return false;
}
}
public Boolean HasSuccessfulResponses
{
get
{
if (this.SucceessfulResponses.Count > 0)
return true;
return false;
}
}
public List<EventResponse> FailedResponses
{
get
{
List<EventResponse> FailedResponses = new List<EventResponse>();
foreach (EventResponse Response in this.EventResponses)
if (Response.ResponseType == EventResponseType.Failure)
FailedResponses.Add(Response);
return FailedResponses;
}
}
public List<EventResponse> SucceessfulResponses
{
get
{
List<EventResponse> SucceededResponses = new List<EventResponse>();
foreach (EventResponse Response in this.EventResponses)
if (Response.ResponseType == EventResponseType.Success)
SucceededResponses.Add(Response);
return SucceededResponses;
}
}
protected List<Event> _ForwardedEvents = null;
public List<Event> ForwardedEvents
{
get
{
List<Event> FowardedEvents = new List<Event>();
lock (this._ForwardedEvents)
foreach (Event ForwardedEvent in this.ForwardedEvents)
ForwardedEvents.Add(ForwardedEvent);
return ForwardedEvents;
}
}
#endregion
#region Constructors
protected Event()
{
this._EventResponses = new List<EventResponse>();
this._EventStackTrace = new StackTrace();
this._ForwardedEvents = new List<Event>();
}
public Event(Object EventSource, String EventMessage, DateTime EventTime)
: this()
{
this.EventSource = EventSource;
this.EventTime = EventTime;
this.EventMessage = EventMessage;
return;
}
public Event(Object EventSource, String EventMessage)
: this(EventSource, EventMessage, DateTime.Now)
{
}
#endregion
#region Supporting Methods
public void AddResponse(EventResponse Response)
{
lock (this._EventResponses)
{
this._EventResponses.Add(Response);
}
if (Response.ResponseType == EventResponseType.Failure)
this.TriggerResponseFailure(Response);
return;
}
public EventResponse CreateResponse()
{
return new EventResponse(this);
}
public EventResponse CreateResponse(Object ResponseSource, Object ResponseObject, DateTime ResponseTime, String ResponseMessage, EventResponseType ResponseType)
{
return new EventResponse(this, ResponseSource, ResponseObject, ResponseTime, ResponseMessage, ResponseType);
}
public EventResponse CreateResponse(Object ResponseSource, Object ResponseObject, DateTime ResponseTime, EventResponseType ResponseType)
{
return this.CreateResponse(ResponseSource, ResponseObject, ResponseTime, String.Empty, ResponseType);
}
public EventResponse CreateResponse(Object ResponseSource, Object ResponseObject, DateTime ResponseTime)
{
return this.CreateResponse(ResponseSource, ResponseObject, ResponseTime, EventResponseType.Success);
}
public EventResponse CreateResponse(Object ResponseSource, Object ResponseObject, EventResponseType ResponseType)
{
return this.CreateResponse(ResponseSource, ResponseObject, DateTime.Now, ResponseType);
}
public EventResponse CreateResponse(Object ResponseSource, Object ResponseObject)
{
return this.CreateResponse(ResponseSource, ResponseObject, EventResponseType.Success);
}
public EventResponse CreateResponse(Object ResponseSource, String ResponseMessage)
{
return this.CreateResponse(ResponseSource, null, DateTime.Now, ResponseMessage, EventResponseType.Success);
}
public EventResponse CreateResponse(String ResponseMessage)
{
return this.CreateResponse(null, ResponseMessage);
}
public EventResponse CreateResponse(Object ResponseSource)
{
return this.CreateResponse(ResponseSource, String.Empty);
}
public Event Forward(Object ForwardFrom)
{
Event ForwardedEvent = new Event(ForwardFrom, this.EventMessage, this.EventTime);
lock (this._ForwardedEvents)
this._ForwardedEvents.Add(ForwardedEvent);
return ForwardedEvent;
}
#endregion
#region Event Triggers
protected void TriggerResponseFailure(EventResponse Response)
{
if (this.OnResponseFailure != null)
this.OnResponseFailure(new Event(Response, "A failure was encountered while executing this event."));
return;
}
#endregion
}
public class EventResponse : IDisposable
{
#region Fields
protected Event _SourceEvent = null;
public Event SourceEvent
{
get
{
return this._SourceEvent;
}
}
public Object ResponseSource = null;
public Type ResponseSourceType
{
get
{
return this.ResponseSource.GetType();
}
}
public Object ResponseObject = null;
public Type ResponseObjectType
{
get
{
return this.ResponseObject.GetType();
}
}
public DateTime ResponseTime = DateTime.Now;
public String ResponseMessage = String.Empty;
protected StackTrace _ResponseStackTrace = null;
public StackTrace ResponseStackTrace
{
get
{
return this._ResponseStackTrace;
}
}
public EventResponseType ResponseType = EventResponseType.Success;
#endregion
#region Constructors
public EventResponse(Event SourceEvent)
{
this._SourceEvent = SourceEvent;
this._ResponseStackTrace = new StackTrace();
}
public EventResponse(Event SourceEvent, Object ResponseSource, Object ResponseObject, DateTime ResponseTime, String ResponseMessage, EventResponseType ResponseType)
: this(SourceEvent)
{
this.ResponseSource = ResponseSource;
this.ResponseObject = ResponseObject;
this.ResponseTime = ResponseTime;
this.ResponseMessage = ResponseMessage;
this.ResponseType = ResponseType;
return;
}
public EventResponse(Event SourceEvent, Object ResponseSource, Object ResponseObject, DateTime ResponseTime, EventResponseType ResponseType)
: this(SourceEvent,ResponseSource,ResponseObject,ResponseTime,String.Empty,ResponseType)
{
}
public EventResponse(Event SourceEvent, Object ResponseSource, Object ResponseObject, DateTime ResponseTime)
: this(SourceEvent, ResponseSource, ResponseObject, ResponseTime, EventResponseType.Success)
{
}
public EventResponse(Event SourceEvent, Object ResponseSource, Object ResponseObject, EventResponseType ResponseType)
: this(SourceEvent, ResponseSource, ResponseObject, DateTime.Now, ResponseType)
{
}
public EventResponse(Event SourceEvent, Object ResponseSource, Object ResponseObject)
: this(SourceEvent, ResponseSource, ResponseObject, EventResponseType.Success)
{
}
public EventResponse(Event SourceEvent, Object ResponseSource, EventResponseType ResponseType)
: this(SourceEvent, ResponseSource, null, DateTime.Now, String.Empty, ResponseType)
{
}
public EventResponse(Event SourceEvent, Object ResponseSource, String ResponseMessage)
: this(SourceEvent, ResponseSource, null, DateTime.Now, ResponseMessage, EventResponseType.Success)
{
}
public EventResponse(Event SourceEvent, String ResponseMessage)
: this( SourceEvent, null, ResponseMessage )
{
}
#endregion
#region Supporting Methods
public void FinalizeResponse()
{
this.SourceEvent.AddResponse(this);
return;
}
#endregion
#region Overrides
public void Dispose()
{
if (this.SourceEvent == null)
return;
else if (this.SourceEvent.EventResponses.Contains(this))
return;
else
{
EventResponse NewResponse = new EventResponse(this.SourceEvent, this.ResponseSource, this.ResponseObject, this.ResponseTime, this.ResponseMessage, this.ResponseType);
NewResponse.FinalizeResponse();
return;
}
}
#endregion
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
运用系统反思;
名称空间MyNamespace.Events
{
公共类事件驱动程序:IDisposable
{
#区域支持活动
公共列表FireEvent(字符串EventName,事件)
{
列表响应列表=新列表();
Type LocalType=this.GetType();
类型TargetType=null;
if((TargetType=this.FindEventType(LocalType,EventName))==null)
{
返回应答器;
}
其他的
{
FieldInfo TargetField=TargetType.GetField(事件名称,BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
MulticastDelegate EventDelegates=(MulticastDelegate)TargetField.GetValue(此);
if(EventDelegates==null)
{
返回应答器;
}
其他的
{
foreach(EventDelegates.GetInvocationList()中的委托TargetDelegate)
{
尝试
{
objectdelegateresponse=TargetDelegate.DynamicInvoke(新对象[]{Event});
EventResponse=(EventResponse)DelegateResponse;
响应列表。添加(响应);
}
捕获(例外e)
{
}
}
返回应答器;
}
}
}
私有类型FindEventType(类型RootType,字符串EventName)
{
if(RootType==null)
{
返回null;
}
else if(String.IsNullOrEmpty(EventName))
{
返回null;
}
其他的
{
FieldInfo EventField=null;
foreach(RootType.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)中的FieldInfo方法)
if(Method.Name==EventName)
{
EventField=方法;
打破
}
if(EventField==null)
{
if(RootType.BaseType==null)
返回null;
其他的
返回此.FindEventType(RootType.BaseType,EventName);
}
其他的
{
返回根类型;
}
}
}
#端区
#区域Di
public delegate object GetObject();
public event GetObject MyEvent;
public IList<object> RaiseMyEvent()
{
var myList = new List<object>();
if (MyEvent != null)
foreach (var handler in MyEvent.GetInvocationList())
myList.Add(handler.DynamicInvoke());
return myList;
}