c#扩展方法奇思妙用变态篇二:封装 if/else、swith/case及while
2010-09-30 20:46:12 来源:WEB开发网简单清晰明了!
最后是一个对while的扩展封装:
public static void While<T>(this T t, Predicate<T> predicate, Action<T> action) where T: class
{
while (predicate(t)) action(t);
}
调用代码:
public static void Test6()
{
People people = new People { Name = "Wretch" };
people.While(
p => p.WorkCount < 7,
p => p.Work()
);
people.Rest();
}
这里又“召唤”了一个人,不让吃喝不让休息,连续工作7次...
这while扩展中只能执行一个Action<T>,不太好,我们用params改进一下:
public static void While<T>(this T t, Predicate<T> predicate, params Action<T>[] actions) where T : class
{
while (predicate(t))
{
foreach (var action in actions)
action(t);
}
}
再来调用,可以在循环中执行多个操作了,这次舒服工作完吃饭喝水休息,再来工作...
public static void Test7()
{
People people = new People { Name = "Wretch" };
people.While(
p => p.WorkCount < 7,
p => p.Work(),
p => p.Eat(),
p => p.Drink(),
p => p.Rest()
);
people.Rest();
}
当然前面的If也可以这样的,这里只写出一个:
If改进
public static T If<T>(this T t, Predicate<T> predicate, params Action<T>[] actions) where T : class
{
if (t == null) throw new ArgumentNullException();
if (predicate(t))
{
foreach (var action in actions)
action(t);
}
return t;
}
不使用 params,你就要显示声明一个Action<T>的集合了!
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换
更多精彩
赞助商链接