zoukankan      html  css  js  c++  java
  • 委托、多播委托、泛型委托Func,Action,Predicate,ExpressionTree

    当试图通过一个事件触发多个方法,抽象出泛型行为的时候,或许可以考虑使用委托。

     

      通过委托构造函数或委托变量把方法赋值给委托

            private delegate double DiscountDelegate(double discount);
            private static DiscountDelegate dd = getDiscountRate;
            static void Main(string[] args)
            {
                double discountPercent;
                discountPercent = dd.Invoke(80);
                Console.WriteLine("打折比例是{0}",discountPercent);
     
                DiscountDelegate dd1 = new DiscountDelegate(getDiscountRate);
                discountPercent = dd1(90);
                Console.WriteLine("打折比例是{0}", discountPercent);
                Console.ReadKey();
            }
     
            static double getDiscountRate(double discount)
            {
                return (discount/100);
            }

     

      多播委托

            private delegate double CalculateDelegate(double x, double y);
            private static CalculateDelegate cd = getPlus;
     
            static void Main(string[] args)
            {
                double result1 = cd.Invoke(1, 2);
                Console.WriteLine(result1);
                cd += new CalculateDelegate(getMinus);
                double result2 = cd.Invoke(1, 2);
                Console.WriteLine(result2);
                Console.ReadKey();
            }
     
            static double getPlus(double x, double y)
            {
                return (x + y);
            }
     
            static double getMinus(double x, double y)
            {
                return (x - y);
            }

     

      泛型委托

    □ Func<>规定输入输出的泛型委托

        Func<Calculate, double> func = c => c.X*3 + c.Y;
        Calculate calculate = new Calculate(){X = 2,Y=3};
        double result = func(calculate);
        Console.WriteLine(result);
     
        class Calculate
        {
            public double X { get; set; }
            public double Y { get; set; }
        }       

     

    □ Action<>规定输入的泛型委托

        ction<string> MyAction = x => Console.WriteLine(x);
         MyAction("Hello World");    

     

    □ Predicate<>规定输出为bool类型的泛型委托

       string date = "2012/05/10";
        Predicate<string> isDate = d => IsDate(d);
        if (isDate(date))
        {
            Console.WriteLine("有效");
        }
        else
        {
            Console.WriteLine("无效");
        }
     
        private static bool IsDate(string date)
        {
            DateTime dt;
            return DateTime.TryParse(date, out dt);
        }   
     

     

    □ ExpressionTree泛型委托

        //(5+4)-(2-1)
        //5+4
        BinaryExpression exp1 = Expression.MakeBinary(ExpressionType.Add, Expression.Constant(5),Expression.Constant(4));
        //2-1
        BinaryExpression exp2 = Expression.MakeBinary(ExpressionType.Subtract, Expression.Constant(2),Expression.Constant(1));
     
        //(5+4)-(2-1)
        BinaryExpression resultExp = Expression.MakeBinary(ExpressionType.Subtract, exp1, exp2);
        int result = Expression.Lambda<Func<int>>(resultExp).Compile()();
        Console.WriteLine(result);
        Console.ReadKey();     
  • 相关阅读:
    Java第9次作业--接口及接口回调
    Java第8次作业--继承
    软件工程第三次作业——关于软件质量保障初探
    Java第7次作业--访问权限、对象使用
    Java第6次作业--static关键字、对象
    Java第5次作业--对象的创建与使用
    20194629 自动生成四则运算题第一版报告
    软件工程第一次作业
    今天开通博客啦!
    1170. Compare Strings by Frequency of the Smallest Character
  • 原文地址:https://www.cnblogs.com/darrenji/p/3727230.html
Copyright © 2011-2022 走看看