1. 程式人生 > >再談.NET委托(delegate、Func<>)

再談.NET委托(delegate、Func<>)

假設 object where nbsp 所有 lam 結果 負責 tac

為了演示委托,我們先來定義一個方法:
public static bool IsTen(int i)
{
return i == 10 ? true : false;
}

如果要用自定義委托,則需要聲明:
delegate bool IsTenDelegate(int i);

示例一:
//這是最基本的寫法
IsTenDelegate d = new IsTenDelegate(IsTen);
Console.WriteLine(d(10)); //true

示例二:
//自定義匿名委托
IsTenDelegate d = delegate(int i) { return i == 10 ? true : false; };
Console.WriteLine(d(10)); //true


示例三:
//或者使用系統現有的委托Func<>,結合lambda表達式
Func<int, bool> d = p => p == 10 ? true : false;
Console.WriteLine(d(10)); //true

示例四:
//或者也可以這麽寫
Func<int, bool> d = delegate(int i) { return i == 10 ? true : false; };
Console.WriteLine(d(10)); //true

-------------- 高端大氣上檔次的分割線 --------------------

下面我們來看一個Func<>委托的實際應用場景:
//假設有一個Model
public class TModel
{
public int ID { get; set; }
public string Name { get; set; }
public List<string> Friends { get; set; }
}

//提供一個處理單個Model數據的方法模板,返回方法集合
public static List<Func<TModel, object, object>> DataConver()
{
List<Func<TModel, object, object>> list = new List<Func<TModel, object, object>>();
list.Add((t, p) => t.ID = (int)p);
list.Add((t, p) => t.Name = p.ToString());
return list;
}

//利用方法集合處理數據,並返回結果數據
//此方法為一個泛型方法,接受類型參數T
public static List<T> GetData<T>(List<Func<T, object, object>> dataMaker) where T:class,new()
{
List<T> lst = new List<T>();
T t = new T();
for (int i = 0; i < dataMaker.Count; i++)
{
//因為dataMaker是方法集合,而每個方法都負責處理T中的一個成員,
//這裏假設所有方法的第二個參數都是123,
//具體應用場景應該是根據T對應的成員類型做不同的轉換。
dataMaker[i](t, 123);
}
lst.Add(t);
return lst;
}

//調用
List<TModel> list = GetData<TModel>(DataConver());

再談.NET委托(delegate、Func<>)