其实.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 );
注:网吧行文,方法无法测试,仅表达思路。
网吧行文,多有不便,今天就到此为止吧。最近函数式的讨论很热,所以想瞎写两篇文章来推波助澜一下,呵呵。