代码之家  ›  专栏  ›  技术社区  ›  Guilherme Duarte

将委托传递为方法参数

  •  6
  • Guilherme Duarte  · 技术社区  · 14 年前

    我目前正在开发一个EventManager类,以确保没有任何事件被连接到死的WCF双工客户机,并控制防止同一客户机与同一事件之间的多个连接。

    现在基本上,我一直在尝试将事件委托传递给一个函数,这个函数将像这样控制分配。

    var handler = new SomeEventHandler(MyHandler);
    Wire(myObject.SomeEventDelegate, handler);
    

    称之为:

    private void Wire(Delegate eventDelegate, Delegate handler)
    {
        // Pre validate the subscription.
        eventDelegate = Delegate.Combine(eventDelegate, handler);
        // Post actions (storing subscribed event delegates in a list)
    }
    

    更新

    SomeEventDelegate包装的代码是:

    public Delegate SomeEventDelegate
    {
        get { return SomeEvent; }
        set { SomeEvent = (SomeEventHandler) value; }
    }
    
    event SomeEventHandler SomeEvent;
    

    显然,委托没有返回到myObject.someEventDelegate 我不能从方法返回委托,因为我也需要一些验证。 你知道怎么做吗?

    1 回复  |  直到 8 年前
        1
  •  5
  •   Cameron    14 年前

    使用 C# ref parameter modifier :

    var handler = new SomeEventHandler(MyHandler);
    Wire(ref myObject.SomeEventDelegate, handler);
    
    private void Wire(ref Delegate eventDelegate, Delegate handler)
    {
        // Pre validate the subscription.
        eventDelegate = Delegate.Combine(eventDelegate, handler);
        // Post actions (storing subscribed event handlers in a list)
    }
    

    还要注意,存在一些很好的语法结构(如c 2.0),用于分配和组合委托(请参见 this article 例如:

    Wire(ref myObject.SomeEventDelegate, MyHandler);
    
    private void Wire(ref Delegate eventDelegate, Delegate handler)
    {
        // Pre validate the subscription.
        eventDelegate += handler;
        // Post actions (storing subscribed event handlers in a list)
    }
    

    有人向我指出 裁判 只适用于字段,而不适用于属性。对于属性,可以使用中间变量:

    var tempDelegate = myObject.SomeEventDelegate;
    Wire(ref tempDelegate, MyHandler);
    myObject.SomeEventDelegate = tempDelegate;