在上一篇博文中,咱們知道了委託就是一種用來聲明一個變量的數據類型,只不過委託聲明的變量能夠接受一個方法,只要方法簽名保持一致就好了。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... }