如何使用相同的重复事件重构两个类?

Rya*_*hel 6 c# events inheritance

这两个类都包含另一个引发事件的私有类.然后,这两个类将这些事件重新提升给客户端.

不幸的是,这两个类中的每一个都有完全相同的代码:

public class FirstClass
{
    public delegate void FooEventHandler(string foo);
    public delegate void BarEventHandler(string bar);
    public delegate void BazEventHandler(string baz);

    public event FooEventHandler Foo;
    public event BarEventHandler Bar;
    public event BazEventHandler Baz;

    private PrivateObject privateObject;

    public FirstClass()
    {
        privateObject.Foo += FirstClass_Foo;
        privateObject.Bar += FirstClass_Bar;
        privateObject.Baz += FirstClass_Baz;
    }

    private void FirstClass_Foo(string foo)
    {
        if (Foo != null)
        {
            Foo(foo);
        }
    }

    private void FirstClass_Bar(string bar)
    {
        if (Bar != null)
        {
            Bar(bar);
        }
    }

    private void FirstClass_Baz(string baz)
    {
        if (Baz != null)
        {
            Baz(baz);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我必须从私有对象重新引发事件.这是多余的.我尝试使用继承并将此重复代码放在基类中但我不断收到如下错误:

事件'BaseClass.Foo'只能出现在+ =或 - =的左侧(除非在类型中使用)

有谁知道如何摆脱这个重复的代码?

And*_*rea 5

将私有对象的事件公开为包装器的属性怎么样?如,

public class ExternalClass
{
    private InternalClass _internalObject = new InternalClass();

    public event InternalClass.someDelegate SomeEvent
    {
        add
        {
            _internalObject.SomeEvent += value;
        }
        remove
        {
            _internalObject.SomeEvent -= value;
        }
    }
}

public class InternalClass
{
    public delegate void someDelegate(string input);
    public event someDelegate SomeEvent;
}
Run Code Online (Sandbox Code Playgroud)

如果您熟悉c#Properties,则可能已经知道了getset关键字.该add/ remove关键字是基本相同的事情,只有他们被解雇当您尝试添加或删除价值,你的财产.

因此,当您命令(取消)注册您的代理时ExternalClass.SomeEvent,您实际上(未)注册该InternalClass.SomeEvent事件.

如果您不熟悉c#Properties,http://msdn.microsoft.com/en-us/library/x9fsa0sw(v = vs.80).aspx会对您有所帮助.

  • 您最好不要将OnEvent用作活动名称.OnEvent是方法引发/触发事件的标准名称.另外,我同意你的回应. (2认同)