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

sma*_*man 5 .net c# events event-handling eventargs

在所有.NET书中,我已经阅读了实现事件的指南,解释了您需要子类化EventArgs并使用EventHandler.我在http://msdn.microsoft.com/en-us/library/ms229011.aspx上查找了更多信息,它说"请使用System.EventHandler而不是手动创建新的委托以用作事件处理程序." 我知道使用EventArgs有很重要的理由,但我的问题不是"我应该这样做吗?",而是"我可以这样做吗?".

有什么理由不能使用通用委托代替EventHandler我的事件吗?例如,如果我想要一个强类型的发送者(其他人对此感到恼火object sender?).

为了解释我的意思更好,有什么理由以下不起作用?

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 6

这只是惯例,并没有语言要求.您可以将任何委托类型用作事件.

标准EventHandler<T>签名虽然有以下几个优点:

  1. 您可以扩展EventArgs参数.如果您想要传递给eventhandler的每个事物都有一个参数,那么这将不起作用.
  2. 接受EventArgs基类的EventHandler 可以订阅遵循约定的任何事件
  3. 您可以添加EventHandler<T>在所有事件上显示的扩展方法.
  4. 返回类型是void.其他返回类型作为事件处理程序没有多大意义.
  5. 你遵循惯例.遵循惯例通常是一个好主意,除非你有令人信服的论据.