一、泛型委托
如果将委托中的参数定义成泛型即是泛型委托,代码如下:
1 //带1个参数的泛型委托 2 public delegate string MyGenericDelegate1<T1>(T1 code, string msg); 3 4 //带2个参数的泛型委托,T1是方法的形参类型, TR是方法返回值类型 5 public delegate TR MyGenericDelegate2<T1, TR>(T1 code, string msg); 6 7 public class Class33 8 { 9 public void Test1() 10 { 11 MyGenericDelegate1<string> d1; 12 d1 = Class6.NotifyJson; 13 d1.Invoke("100","SUCCESS"); //用Invoke方法调用 14 15 MyGenericDelegate2<string, string> d21;//第2个string是返回值类型 16 d21 = Class6.NotifyXml; 17 d21("100", "SUCCESS"); //用委托变量调用 18 19 MyGenericDelegate2<int, string> d22;//第2个string是返回值类型 20 d22 = Class6.NotifyXml2; 21 d22(100, "SUCCESS"); //用委托变量调用 22 } 23 }
在声明委托变量的时候必须指定类型,调用的时候传入的实参类型必须和声明时一致。
二、C#内置的三个泛型委托Action、Func、Predicate
为了便于我们使用委托,C#内置了3个泛型委托,这3个泛型委托的区别如下:
名称 | 定义 | 形参数量 | 返回值类型 |
Action | Action<T1, T2, T3, T4, T5 ...> | 0-16个 | void |
Func | Func<T1, T2, T3, T4, T5 ..., TR> | 0-16个 | 泛型TR |
Predicate | Predicate<T> | 1个 | bool |
有了这3个内置的泛型委托,不需要自己去定义就可以满足我们绝大部分使用委托的场景了。
探讨c#中的泛型、委托、泛型委托、Action和Func及使用场景系列之四:泛型委托及系统内置Action和Func介绍(完结篇)