当前位置:编程学习 > C#/ASP.NET >>

c#扩展方法switch/case组扩展

变态篇二中给出了对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。
首先看这些扩展的一个最简单的应用,如下:
 

1     string typeName = string.Empty;
2     typeId.Switch((string s) => typeName = s)
3        
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,