• 再谈.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());

  • 相关阅读:
    Explain详解
    InnoDB缓存---InnoDB Buffer Pool
    多线程之---线程同步
    多线程之--等待与通知
    谈算法与数据结构的学习
    分布式系统理论
    算法与数据结构基础
    算法与数据结构基础
    算法与数据结构基础
    算法与数据结构基础
  • 原文地址:https://www.cnblogs.com/zhaow/p/9754586.html
Copyright © 2020-2023  润新知