zoukankan      html  css  js  c++  java
  • 继续高阶函数好玩有用的扩展(网吧行文)

    其实.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 );
    注:网吧行文,方法无法测试,仅表达思路。


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

  • 相关阅读:
    【Java学习笔记】<集合框架>Iterator的子接口ListIterator
    【Java学习笔记】<集合框架>List特有的取出方式之一
    【Java学习笔记】集合框架Ⅱ
    【Java学习笔记】集合框架Ⅰ
    【PS】Ⅱ图像合成与渐变工具笔记
    【PS】Ⅰ基础及选框工具笔记
    [PS]简单的智能电视制作案例
    Spring中线程池的使用
    SpringBoot 多线程
    solr DIH 设置定时索引
  • 原文地址:https://www.cnblogs.com/Ivony/p/1552320.html
Copyright © 2011-2022 走看看