泛型委托

无论是在类定义内还是类定义外,委托可以定义自己的类型参数。引用泛型委托的代码可以指定类型参数来创建一个封闭构造类型,这和实例化泛型类或调用泛型方法一样,如下例所示:

public delegate void MyDelegate<T>(T item);
public void Notify(int i){}
//...
 
MyDelegate<int> m = new MyDelegate<int>(Notify);

C#2.0版有个新特性称为方法组转换(method group conversion),具体代理和泛型代理类型都可以使用。用方法组转换可以把上面一行写做简化语法:

MyDelegate<int> m = Notify;

 

在泛型类中定义的委托,可以与类的方法一样地使用泛型类的类型参数。

class Stack<T>
{
T[] items;
      int index
//...
public delegate void StackDelegate(T[] items);
}

引用委托的代码必须要指定所在类的类型参数,如下:

Stack<float> s = new Stack<float>();
Stack<float>.StackDelegate myDelegate = StackNotify;

泛型委托在定义基于典型设计模式的事件时特别有用。因为sender[JX2] ,而再也不用与Object相互转换。

public void StackEventHandler<T,U>(T sender, U eventArgs);
class Stack<T>
{
    //
    public class StackEventArgs : EventArgs{...}
    public event StackEventHandler<Stack<T>, StackEventArgs> stackEvent;
    protected virtual void OnStackChanged(StackEventArgs a)
    {
      stackEvent(this, a);
    }
}
class MyClass
{
  public static void HandleStackChange<T>(Stack<T> stack, StackEventArgs args){...};
}
Stack<double> s = new Stack<double>();
MyClass mc = new MyClass();
s.StackEventHandler += mc.HandleStackChange;

 

posted @ 2020-03-05 19:57  ElevenXiao  阅读(182)  评论(0编辑  收藏  举报