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

为了演示委托,我们先来定义一个方法:
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());

原文地址:https://www.cnblogs.com/zhaow/p/9754586.html