Dav*_*vid 6 c# events delegates
在我的域层中,所有域对象都会发出事件(类型为InvalidDomainObjectEventHandler),以指示调用IsValid属性时的无效状态.
在aspx代码隐藏中,我必须手动连接域对象的事件,如下所示:
_purchaseOrder.AmountIsNull += new DomainObject.InvalidDomainObjectEventHandler(HandleDomainObjectEvent);
_purchaseOrder.NoReason += new DomainObject.InvalidDomainObjectEventHandler(HandleDomainObjectEvent);
_purchaseOrder.NoSupplier += new DomainObject.InvalidDomainObjectEventHandler(HandleDomainObjectEvent);
_purchaseOrder.BothNewAndExistingSupplier += new DomainObject.InvalidDomainObjectEventHandler(HandleDomainObjectEvent);
Run Code Online (Sandbox Code Playgroud)
请注意,在每种情况下都会调用相同的方法,因为InvalidDomainobjectEventArgs类包含要显示的消息.
有没有什么办法可以编写一个语句来连接所有类型为InvalidDomainObjectEventHandler的事件?
谢谢
大卫
我不认为你可以在一个声明中做到这一点..但你可以使代码更容易读取如下:
_purchaseOrder.AmountIsNull += HandleDomainObjectEvent;
_purchaseOrder.NoReason += HandleDomainObjectEvent;
_purchaseOrder.NoSupplier += HandleDomainObjectEvent;
_purchaseOrder.BothNewAndExistingSupplier += HandleDomainObjectEvent;
Run Code Online (Sandbox Code Playgroud)
除此之外 - 似乎答案是否定的:(
我看了鲍勃·萨默斯的建议。编译器不喜欢 GetEvents() 返回的 EventInfo[] 的 .Where 方法,但我将代码稍微更改为以下内容:
private void HookUpEvents()
{
Type purchaseOrderType = typeof (PurchaseOrder);
var events = purchaseOrderType.GetEvents();
foreach (EventInfo info in events)
{
if (info.EventHandlerType == typeof(Kctc.Data.Domain.DomainObject.InvalidDomainObjectEventHandler))
{
info.AddEventHandler(_purchaseOrder, new Kctc.Data.Domain.DomainObject.InvalidDomainObjectEventHandler(HandleDomainObjectEvent));
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我将此方法添加到页面后,一切都非常顺利。我可以将事件添加到采购订单对象,而不必记住将它们单独连接,这正是我想要的。