泛型委托
无论是在类定义内还是类定义外,委托可以定义自己的类型参数。引用泛型委托的代码可以指定类型参数来创建一个封闭构造类型,这和实例化泛型类或调用泛型方法一样,如下例所示:
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;
野心成就不了你,热爱可以。