WEB开发网
开发学院软件开发C语言 c#扩展方法奇思妙用变态篇三:switch/case组扩展 阅读

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 }

 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值...直到最后一个。

这样处理会带来一定的性能损失(很小很小),这是链式编程的缺点,无法解决。

这个方法思路上有点怪,性能也有损失,但它确实能减少代码量(是否易于书写和维护另说)。

每个人想法不同,思路相差很大,不知道这里的扩展是否适合你。也不知道你能否接收“组扩展”的概念。

上一页  1 2 3 4 5 6 

Tags:扩展 方法 奇思

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接