變態篇二中給出了對if/else、swith/case及while 的擴展,大家評價各不相同,其實本人也感覺有點牽強。其中舉了一個Swith擴展的應用,今天突然有了新想法,對它改進了一些。所謂“語不驚人死不休”,且看這次的改進如何。
1 public static class SwithCaseExtension
2 {
3 SwithCase#region SwithCase
4 public class SwithCase<TCase, TOther>
5 {
6 public SwithCase(TCase value, Action<TOther> action)
7 {
8 Value = value;
9 Action = action;
10 }
11 public TCase Value { get; private set; }
12 public Action<TOther> Action { get; private set; }
13 }
14 #endregion
15
16 Swith#region Swith
17 public static SwithCase<TCase, TOther> Switch<TCase, TOther>(this TCase t, Action<TOther> action) where TCase : IEquatable<TCase>
18 {
19 return new SwithCase<TCase, TOther>(t, action);
20 }
21
22 public static SwithCase<TCase, TOther> Switch<TInput, TCase, TOther>(this TInput t, Func<TInput, TCase> selector, Action<TOther> action) where TCase : IEquatable<TCase>
23 {
24 return new SwithCase<TCase, TOther>(selector(t), action);
25 }
26 #endregion
27
28 Case#region Case
29 public static SwithCase<TCase, TOther> Case<TCase, TOther>(this SwithCase<TCase, TOther> sc, TCase option, TOther other) where TCase : IEquatable<TCase>
30 {
31 return Case(sc, option, other, true);
32 }
33
34
35 public static SwithCase<TCase, TOther> Case<TCase, TOther>(this SwithCase<TCase, TOther> sc, TCase option, TOther other, bool bBreak) where TCase : IEquatable<TCase>
36 {
37 return Case(sc, c=>c.Equals(option), other, bBreak);
38 }
39
40
41 public static SwithCase<TCase, TOther> Case<TCase, TOther>(this SwithCase<TCase, TOther> sc, Predicate<TCase> predict, TOther other) where TCase : IEquatable<TCase>
42 {
43 return Case(sc, predict, other, true);
44 }
45
46 public static SwithCase<TCase, TOther> Case<TCase, TOther>(this SwithCase<TCase, TOther> sc, Predicate<TCase> predict, TOther other, bool bBreak) where TCase : IEquatable<TCase>
47 {
48 if (sc == null) return null;
49 if (predict(sc.Value))
50 {
51 sc.Action(other);
52 return bBreak ? null : sc;
53 }
54 else return sc;
55 }
56 #endregion
57
58 Default#region Default
59 public static void Default<TCase, TOther>(this SwithCase<TCase, TOther> sc, TOther other)
60 {
61 if (sc == null) return;
62 sc.Action(other);
63 }
64 #endregion
65 }
這段代碼定義了三個擴展Switch、Case和Default。
首先看這些擴展的一個最簡單的應用,如下: