C# 3.0 - Extension Methods 練習
C# 3.0 的新語言特性 Extension Methods,可以讓程式設計師對現有的類別增加額外的靜態方法。
以下 Extension Methods 範例,對系統 string 類別擴充 ToMD5() 方法與 ToSHA1() 方法,對 int 類別擴充 Square() 與 Cube() 方法。
首先,建立自訂命名 MyEctensionMethods 的命名空間,並建立自訂命名 StringExtensionMethods 靜態類別。最後,建立 public static string ToMD5(this string source) 的靜態方法,其中參數必須以 this string s 方式宣告:以 this 開頭,中間是符合擴充類別 stirng 的型態,最後是自訂變數名稱 source。
1: namespace MyExtensionMethods
2: {
3: /// <summary>
4: /// 字串型態的Extension Methods
5: /// </summary>
6: public static class StirngExtensionMethods
7: {
8: /// <summary>
9: /// 取得 MD5 加密字串
10: /// </summary>
11: public static string ToMD5(this string source)
12: {
13: MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
14: byte[] bytValue = Encoding.UTF8.GetBytes(source);
15: byte[] bytHash = md5.ComputeHash(bytValue);
16: md5.Clear();
17:
18: StringBuilder sb = new StringBuilder();
19: for (int i = 0; i < bytHash.Length; i++)
20: {
21: sb.Append(bytHash[i].ToString("X").PadLeft(2, '0'));
22: }
23:
24: return sb.ToString().ToLower();
25: }
26: }
27: }
完整範例,包含系統 string 類別擴充 ToMD5() 方法與 ToSHA1() 方法,對 int 類別擴充 Square() 與 Cube() 方法。
1: namespace MyExtensionMethods
2: {
3: /// <summary>
4: /// 字串型態的 Extension Methods
5: /// </summary>
6: public static class StirngExtensionMethods
7: {
8: /// <summary>
9: /// 取得 MD5 加密字串
10: /// </summary>
11: public static string ToMD5(this string source)
12: {
13: MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
14: byte[] bytValue = Encoding.UTF8.GetBytes(source);
15: byte[] bytHash = md5.ComputeHash(bytValue);
16: md5.Clear();
17:
18: StringBuilder sb = new StringBuilder();
19: for (int i = 0; i < bytHash.Length; i++)
20: {
21: sb.Append(bytHash[i].ToString("X").PadLeft(2, '0'));
22: }
23:
24: return sb.ToString().ToLower();
25: }
26:
27: /// <summary>
28: /// 取得 SHA-1 加密字串
29: /// </summary>
30: public static string ToSHA1(this string source)
31: {
32: SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
33: byte[] bytValue = Encoding.UTF8.GetBytes(source);
34: byte[] bytHash = sha1.ComputeHash(bytValue);
35: sha1.Clear();
36:
37: StringBuilder sb = new StringBuilder();
38: for (int i = 0; i < bytHash.Length; i++)
39: {
40: sb.Append(bytHash[i].ToString("X").PadLeft(2, '0'));
41: }
42:
43: return sb.ToString().ToLower();
44: }
45: }
46:
47: /// <summary>
48: /// 整數型態的 Extension Methods
49: /// </summary>
50: public static class IntExtensionMethods
51: {
52: /// <summary>
53: /// 取得平方值
54: /// </summary>
55: public static int Square(this int i)
56: {
57: return i * i;
58: }
59:
60: /// <summary>
61: /// 取得立方值
62: /// </summary>
63: public static int Cube(this int i)
64: {
65: return i * i * i;
66: }
67: }
68: }
使用方式:引入 MyEctensionMethods 的命名空間即可 using MyEctensionMethods;,對於相關擴充 string 與 int 類別,intellisense 就會自洞代初剛剛實作 string 類別的 ToMD5() 方法與 ToSHA1() 方法,對 int 類別擴充 Square() 與 Cube() 方法。
1: string s = "測試";
2: string msg = string.Format("{0}, MD5: {1}, SHA1: {2}", s, s.ToMD5(), s.ToSHA1());
3: Console.Write(msg);
4:
5: Console.WriteLine();
6:
7: int i = 10;
8: string outString = string.Format("{0}, {0}^2: {1}, {0}^3: {2}", i, i.Square(), i.Cube());
9: Console.Write(outString);
輸出:
測試, MD5: b7dfcd49856b273e35b9504a921c8078, SHA1: 8b2da228cf9412ae0cc10113c08c779821bbc19d
10, 10^2: 100, 10^3: 1000