EventArgs类和事件关键字之间是否存在特殊关联?

在所有.NET书中,我已经阅读了实现事件的指南,解释了你需要子类
EventArgs
并使用EventHandler。我在http://msdn.microsoft.com/en-us/library/ms229011.aspx上查找了更多信息,它说“请使用System.EventHandler而不是手动创建新的委托以用作事件处理程序。”我知道使用EventArgs有很重要的理由,但我的问题不是“我应该这样做吗?”,而是“我可以这样做吗?”。 是否有任何理由我不能使用通用委托而不是
EventHandler
与我的事件?例如,如果我想要一个强类型的发送者(其他任何人都被那个ann2ѭ惹恼了?)。 为了解释我的意思更好,有什么理由以下不起作用?
public class IoC
{
    public AbstractFactory GetAbstractFactory()
    {
        var factory = new AbstractFactory();
        factory.CreateObject += ()=>new object();
        return factory;
    }
}
public class AbstractFactory
{
    public event Func<object> CreateObject;

    private object OnObjectCreated()
    {
        if(CreateObject == null)
        {
            throw new Exception("Not injected.");
        }
        return CreateObject();
    }


    private object _injectedObject;
    public object InjectedObject
    {
        get
        {
            if(_injectedObject == null)
            {
                _injectedObject = OnObjectCreated();
            }
            return _injectedObject;
        }
    }
}
    
已邀请:
这只是惯例,没有语言要求。您可以将任何委托类型用作事件。 标准的
EventHandler<T>
签名有一些优点: 您可以扩展
EventArgs
参数。如果您想要传递给eventhandler的每个事物都有一个参数,那么这将不起作用。 接受
EventArgs
基类的EventHandler可以订阅遵循约定的任何事件 您可以将扩展方法添加到
EventHandler<T>
,它出现在所有事件中。 返回类型是
void
。其他返回类型作为事件处理程序没有多大意义。 你遵循惯例。遵循惯例通常是一个好主意,除非你有令人信服的论据。     
Microsoft的所有文档都是关于基类库的设计和/或一般框架设计指南。您可以使用您想要的任何模式。 也就是说,如果你按照微软使用的模式,如果人们会消耗你的代码,那么他们会更熟悉它们。     
据我所知,EventHandler和EventArgs是最佳实践,但没有什么可以阻止您在事件声明中使用任意委托。 event关键字为您提供了能够+ =和 - =委托给事件槽的特殊功能,而不是简单地拥有委托类型的字段或属性,它只接受单个委托(除非您组成多个委托)你自己)。 警告:我不确定在事件槽中返回值的代理会发生什么。我的猜测是丢弃返回值,因为分配给事件的返回值的多个委托将难以处理。这需要一些实验。     

要回复问题请先登录注册