继续高阶函数好玩有用的扩展(网吧行文)
2009-08-23 11:28 Ivony... 阅读(603) 评论(6) 编辑 收藏 举报
其实.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 );
注:网吧行文,方法无法测试,仅表达思路。
网吧行文,多有不便,今天就到此为止吧。最近函数式的讨论很热,所以想瞎写两篇文章来推波助澜一下,呵呵。
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 );
注:网吧行文,方法无法测试,仅表达思路。
网吧行文,多有不便,今天就到此为止吧。最近函数式的讨论很热,所以想瞎写两篇文章来推波助澜一下,呵呵。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!