• 继续高阶函数好玩有用的扩展(网吧行文)


    其实.NET Framework的风格一直在不断的变化,变得越来越灵活,语法越来越舒服,但.NET Framework原来还有很多历史遗留问题,使得我们在使用.NET Framework早期的类的时候总不能如同现代的类一样方便。比如说,LINQ to XML新增的类型,就都具备构造函数同时初始化子成员的能力,而这个能力要能移植到原有的诸如ASP.NET和WinForm控件上该多好啊?其实这并不难。

    public static Func//高阶函数帮助方法类,这个不会与泛型委托Func<...>冲突的,^_^
    {
      //...
      public TContainer CreateContainer<TContainer,TChildren>( Action<TContainer, TChildren> appendChildMethod, params TChildren[] childs ) where TContainer : new()//有没有更好的方法名称?
      {
        TContainer container = new TContainer();
        foreach ( TChildren child in childs )
          appendChildMethod( container, child );
        return container;
      }
    }

    这个方法调用的时候:
    var control = Func.CreateContainer<PlaceHolder, Control>( (container, child) => container.Controls.Add( child ), new Image(){ ... }, new HyperLink(){ ... } )
    注:网吧行文,方法无法测试,仅表达思路。

    当然,我们可以固化一些现成的模版:
    public static WebHelper
    {
      //...
      public TContainer CreateControl<TContainer>( params Control[] childs ) where TContainer : Control, new()
      {
        TContainer container = new TContainer();
        foreach ( Control child in childs )
          container.Controls.Add( child );
        return container;
      }
    }
    调用的时候就可以省略第一个参数:
    var control = WebHelper.CreateControl<PlaceHolder>( new Image(){ ... }, new HyperLink(){ ... } )
    注:网吧行文,方法无法测试,仅表达思路。

    当然,配合扩展方法可以做出更多好玩的应用,例如为Control增加一个AppendChilds方法
    public static WebHelper
    {
      public TContainer AppendChilds<TContainer>( TContainer this container, params Control[] childs ) where TContainer : Control
      {
        foreach ( Control child in childs )
          container.Controls.Add( child );
        return container;
      }
    }
    调用:
    Form.AppendChilds( new DataGrid() { ... } )
    配合上面的方法,一次性构造控件树:
    var control = WebHelper.CreateControl<PlaceHolder>(
      (new Panel(){ ... }).AppendChilds(
        new Image(){ ... },
        new HyperLink(){ ... }
      ), LoadUserControl( ... )
    );
    注:网吧行文,方法无法测试,仅表达思路。

    写到后面好像有点跑题,与高阶函数没啥关系了,其实不然,现在继续扯回来。我们经常会遇到要对一个方法连续调用的情况,例如IList.Add之类,而这些方法又经常不会返回自身导致可以链式调用,所以我们还可以做这样的帮助方法:
    public static Func
    {
      //...
      public void BatchExecute<T>( Action<T> executor, params T[] args )
      {
        foreach( var item in args )
          executor( item );
      }
    }
    调用:
    var list = new List<int>();
    Func.BatchExecute( list.Add, 1, 2, 3, 4, 5, 6, 7 );
    注:网吧行文,方法无法测试,仅表达思路。


    网吧行文,多有不便,今天就到此为止吧。最近函数式的讨论很热,所以想瞎写两篇文章来推波助澜一下,呵呵。

  • 相关阅读:
    微信报警提示
    使用pygal图表显示网站API接口数据
    读写文本文件,乱码解决方案
    MD5加密
    将DataTable导入到SQL数据库表中
    NPOI组件操作Excel导入、导出
    二叉树由先序和中序建树
    用两个栈模拟队列
    math type白嫖教程
    IDEA常用快捷键
  • 原文地址:https://www.cnblogs.com/Ivony/p/1552320.html
Copyright © 2020-2023  润新知