在上一篇博文中,咱们知道了委托就是一种用来声明一个变量的数据类型,只不过委托声明的变量能够接受一个方法,只要方法签名保持一致就好了。spa
泛型委托:code
通常在咱们项目中会使用委托,因此咱们来定义几个委托:blog
namespace DemoForDelegate { public delegate void delegateInt(int m); public delegate void delegatedouble(double d); public delegate void delegatestring(string str); public delegate void delegatefloat(float f); public delegate void delegatedecimal(decimal d); }
咱们定义了5个委托,这5个委托用于接受不一样的方法。ci
可是,咱们仔细找下规律就会发现其实这5个委托很类似:返回类型都是void,方法输入参数为1个。不一样的是参数的数据类型。那么我想简化一下代码,想写一个通用的委托来取代上面那5个委托,既然它们的差别是参数的数据类型,那么很容易想到用泛型来让代码变得通用,以下:string
namespace DemoForDelegate { //public delegate void delegateInt(int m); //public delegate void delegatedouble(double d); //public delegate void delegatestring(string str); //public delegate void delegatefloat(float f); //public delegate void delegatedecimal(decimal d); public delegate void MyAction<T>(T arg); }
这样用一个委托就搞定了,因此在咱们项目能够这样多定义一些这样的泛型委托:io
namespace DemoForDelegate { public delegate void MyAction(); public delegate void MyAction<T>(T arg); public delegate void MyAction<T1, T2>(T1 arg1, T2 arg2); public delegate void MyAction<T1, T2, T3>(T1 arg1, T2 arg2,T3 arg3); public delegate void MyAction<T1, T2, T3, T4>(T1 arg1, T2 arg2,T3 arg3,T4 arg4); //more... }
上面的委托都没有返回值,那咱们再定义一些带返回值的委托吧:class
namespace DemoForDelegate { public delegate void MyAction(); public delegate void MyAction<T>(T arg); public delegate void MyAction<T1, T2>(T1 arg1, T2 arg2); public delegate void MyAction<T1, T2, T3>(T1 arg1, T2 arg2,T3 arg3); public delegate void MyAction<T1, T2, T3, T4>(T1 arg1, T2 arg2,T3 arg3,T4 arg4); //more... //带返回值的委托 public delegate TResult MyFunc<out TResult>(); public delegate TResult MyFunc<out TResult,in T1>(T1 arg1); public delegate TResult MyFunc<out TResult,in T1,in T2>(T1 arg1,T2 arg2); public delegate TResult MyFunc<out TResult,in T1,in T2,in T3>(T1 arg1, T2 arg2,T3 arg3); //more... }