【问题标题】:Simplify creation of a delegate by passing a method? [closed]通过传递方法来简化委托的创建? [关闭]
【发布时间】:2014-06-05 18:22:09
【问题描述】:

是否有某种方法可以简化委托的创建以便于阅读编码?这是我想做的一个例子,我想知道是否有办法做到这一点:

public delegate void MyDelegate(Object sender, EventArgs e);

public class ClassWithEvent
{
    public event MyDelegate MyEvent;

    public ClassWithEvent() { }

    public void RegisterForEvent(Method)
    {
        MyEvent += new MyDelegate(Method);
    }

    public void Trigger()
    {
        if(MyEvent != null)
        {
            MyEvent(this, null);
        }
    }

}

public class ClassToRegister
{
    public ClassWithEvent MyEventClass = new ClassWithEvent();

    public ClassToRegister() { }

    public void RegisterMe()
    {
        MyEventClass.RegisterForEvent(MyEventMethod);

        MyEventClass.Trigger();
    }

    public void MyEventMethod(Object sender, EventArgs e)
    {
        Console.Writeline("Hello there!");
    }
}

尝试这样做的目的是为了封装。我假设触发事件的类本质上是访问它的类的黑匣子。由于这将是我能看到的最可取的面向对象流程,我想知道是否有办法做到这一点,或者如果注册类不了解它必须创建的委托,是否根本没有办法做到这一点。

【问题讨论】:

  • 此代码是您想要工作的代码,还是可以工作但您想修改的代码?如果是后者,您能否提供您认为应该有效的方法?
  • 这是假设代码。我对活动和代表还是新手,所以我可能在这里犯了一个与我的问题无关的错误。我只是想知道是否有一种方法可以让一个类简单地传递其方法,而无需在自己的代码中为该方法声明委托。 IE。 - “ClassToRegister”可以在不知道“MyDelegate”名称的情况下订阅“MyEvent”。
  • 通用 Action 委托是否可接受?
  • 也许吧?我不确定如何创建泛型。我想我应该研究那棵树。
  • 这主要是一个文体问题——我什至不确定我所问的是否有用,我想这将允许一种方法订阅可能正在使用的多个不同类完全符合 (Object sender, EventArgs e) 参数的不同委托。

标签: c# events delegates encapsulation object-oriented-analysis


【解决方案1】:

是的,从某种意义上说,您不需要指定的委托来执行此操作。相反,您可以使用通用委托Action(在您的情况下为Action<object, EventArgs>)。动作委托返回 void,并具有与泛型类型参数匹配的参数。

通常您只需直接公开事件(避免“注册”功能),因此无论如何都不需要担心它的那部分。

如果您使用它,您的代码将如下所示:

public class ClassWithEvent
{
    public event Action<object, EventArgs> MyEvent;

    public ClassWithEvent() { }

    public void RegisterForEvent(Action<object, EventArgs> Method)
    {
        MyEvent += Method;
    }

    public void Trigger()
    {
        if(MyEvent != null)
        {
            MyEvent(this, null);
        }
    }

}

public class ClassToRegister
{
    public ClassWithEvent MyEventClass = new ClassWithEvent();

    public ClassToRegister() { }

    public void RegisterMe()
    {
        MyEventClass.RegisterForEvent(MyEventMethod);

        MyEventClass.Trigger();
    }

    public void MyEventMethod(Object sender, EventArgs e)
    {
        Console.Writeline("Hello there!");
    }
}

【讨论】:

  • 非常感谢 - 我还没有真正弄清楚如何查找它,因为我不确定我在寻找什么:msdn.microsoft.com/en-us/library/… 非常感谢。
  • 我觉得“直接暴露事件”是 C# 中似乎违反其面向对象结构的一件事。我仍然不确定我是否对这样的通用委托感到满意,因为我认为我仍然必须在“ClassToRegister”类中声明它 - 但我有点认为没有办法在不制作指针的情况下传递方法无论如何,首先要“存储它”。我正在使用一个内部类创建一个“事件数组”,该类将根据订阅者参数通知订阅者,因此很难让订阅类自己管理数组。
  • 是的,你必须在某处声明类型!我不得不不同意破坏 OOP 的事件,你只是得到一个要调用的函数指针的自动列表。 += 基本上是“注册”功能。不过只是我的看法。很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2012-10-20
  • 2012-01-20
  • 2011-03-02
相关资源
最近更新 更多