c#扩展方法奇思妙用变态篇三:switch/case组扩展
2010-09-30 20:46:08 来源:WEB开发网 1 public class SwithCase<TCase, TOther>
2 {
3 public SwithCase(TCase value, Action<TOther> action)
4 {
5 Value = value;
6 Action = action;
7 }
8 public TCase Value { get; private set; }
9 public Action<TOther> Action { get; private set; }
10 }
因为Case需要“判断的值”和“判断成功的处理”,也就说需要两个“值”(确切说是一个值和一个委托)。
我们使用SwithCase泛型类把这两“值”封装起来,作为Switch的返回。
Case和Default是对SwithCase泛型类作的扩展,Case的返回值也是SwithCase泛型类。
通过SwitchCase泛型类,我们就串起来了,以Swith开始,以Default结束(Default没返回值,Default也可以省略)。
SwichCase泛型类用作这里链式编程的链接有以下好处。
1.平时Case和Default扩展是隐藏的,不会出现在代码智能提示中(因为它是对SwitchCase作的扩展)。
2.只有在Switch扩展的智能提示中,才有Case和Default,才可以使用。
基于以上特性,我称之为“组扩展” :它们是一组,只有使用了组长(Switch)后,才能使用组员。
“组扩展”的优势在于对其它代码的“污染”小(只有一个显示在智能提示中),也避免了直接调用组成员的非法操作。
组扩展先说到这里,我们再来看下Swith的两个参数:Func<TInput, TCase> selector和Action<TOther> action。
第一参数可对传入的实例进行一些处理(调用属性、方法或返回一个新的对象),第二个参数是一个Action<T>可以封闭复杂的操作。
有了这两个参数,Swith可以非常灵活。远不只以上几个应用,只是现在还没发掘出来。
大刀可以杀敌人,也可以削苹果,关键在谁手中,怎么用。
顺便提一下,Switch扩展还可以再加入新的参数,来消减GetReward中的多个“c => c >”,前面的源码中没有给出实现,感兴趣可自己尝试一下。
有一点说明一下,第一个例子中Case(1, "饮料"),默认为typeId为1时自动break,但是在链式编程中是无法忽略后面的Case直接返回的。
现在的处理是判断成功后,返回null值给下一个Case, 下一个Case什么也不执行再向下传递null值...直到最后一个。
这样处理会带来一定的性能损失(很小很小),这是链式编程的缺点,无法解决。
这个方法思路上有点怪,性能也有损失,但它确实能减少代码量(是否易于书写和维护另说)。
每个人想法不同,思路相差很大,不知道这里的扩展是否适合你。也不知道你能否接收“组扩展”的概念。
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换
更多精彩
赞助商链接