C#擴展方法集合類

擴展方法是C#常用簡化代碼的手段,原本含義爲在系統類的基礎上增加自己的方法,比如"xxx{0}xx".format()這種用法,使得軟件開發更爲簡便。在此貼個擴展方法類,用於技術交流

using System;
using System.Text;
using System.Security.Cryptography;
using System.Web.Script.Serialization;

namespace SqlHelper {
	public static class ExtensionMethods {
		/// <summary>
		/// 返回元素在數組中的索引
		/// </summary>
		/// <param name="a">數組</param>
		/// <param name="o">元素</param>
		/// <returns>索引</returns>
		public static int inArray (this object[] a, object o) {
			for (int i = 0; i < a.Length; i++) {
				if (a[i] == o) return i;
			}
			return -1;
		}

		/// <summary>
		/// 返回元素在數組中的索引
		/// </summary>
		/// <param name="o">元素</param>
		/// <param name="a">數組</param>
		/// <returns>索引</returns>
		public static int inArray (this object o, object[] a) {
			return a.inArray (o);
		}

		/// <summary>
		/// URL轉碼
		/// </summary>
		/// <param name="s">原始URL</param>
		/// <returns>新URL</returns>
		public static string encodeUrl (this string s) {
			if (s.isNullOrEmpty ()) return "";
			return s.Replace (":", "%3a").Replace ("/", "%2f").Replace (" ", "+").Replace ("\\", "%2c").Replace ("=", "%3d").Replace ("?", "%3f").Replace ("%", "%25").Replace ("&", "%26");
		}

		/// <summary>
		/// 簡化string.Format函數的調用
		/// </summary>
		/// <param name="s">格式化字符串</param>
		/// <param name="args">參數列表</param>
		/// <returns>格式化後的字符串</returns>
		public static string format (this string s, params object[] args) {
			return string.Format (s, args);
		}

		/// <summary>
		/// 簡化Convert.ToInt32函數的調用
		/// </summary>
		/// <param name="o">需要轉爲數字的對象</param>
		/// <returns>數字</returns>
		public static Int32 toInt32(this object o) {
			try {
				return Convert.ToInt32(o);
			} catch (Exception ex) {
				throw ex;
			}
		}

		/// <summary>
		/// 簡化Convert.ToInt64函數的調用
		/// </summary>
		/// <param name="o">需要轉爲數字的對象</param>
		/// <returns>數字</returns>
		public static Int64 toInt64 (this object o) {
			try {
				return Convert.ToInt64 (o);
			} catch (Exception ex) {
				throw ex;
			}
		}

		/// <summary>
		/// 簡化Convert.ToDouble函數的調用
		/// </summary>
		/// <param name="o">需要轉爲數字的對象</param>
		/// <returns>數字</returns>
		public static double toDouble (this object o) {
			try {
				return Convert.ToDouble (o);
			} catch (Exception ex) {
				throw ex;
			}
		}

		/// <summary>
		/// MD5加密
		/// </summary>
		/// <param name="s">需要加密的數據</param>
		/// <param name="loop">加密次數</param>
		/// <returns>加密後的數據</returns>
		public static string md5Encrypt (this string s, int loop = 3) {
			MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider ();
			for (; loop > 0; loop--) {
				s = BitConverter.ToString (md5.ComputeHash (UTF8Encoding.Default.GetBytes (s))).Replace ("-", "");
			}
			return "{0}-{1}-{2}-{3}-{4}".format (s.Substring (0, 8), s.Substring (8, 4), s.Substring (12, 4), s.Substring (16, 4), s.Substring (20, 12));
		}

		/// <summary>
		/// 簡化string.Join函數調用
		/// </summary>
		/// <param name="s">數組對象</param>
		/// <param name="separator">分隔符</param>
		/// <returns>字符串</returns>
		public static string join (this string[] s, string separator = ";") {
			if (s == null) return "";
			return string.Join (separator, s);
		}

		/// <summary>
		/// 二維數組垂直string.Join函數調用
		/// </summary>
		/// <param name="ss">數組對象</param>
		/// <param name="col">垂直第幾列</param>
		/// <param name="separator">分隔符</param>
		/// <returns>字符串</returns>
		public static string join (this string[][] ss, int col, string separator = ";") {
			if (ss == null || ss.Length == 0)
				return "";
			StringBuilder sb = new StringBuilder ();
			for (int i = 0; i < ss.Length; i++) {
				sb.Append (ss[i][col]).Append (separator);
			}
			return sb.Remove (sb.Length - separator.Length, separator.Length).toString ();
		}

		/// <summary>
		/// 簡化string.IsNullOrEmpty函數調用
		/// </summary>
		/// <param name="s">字符串</param>
		/// <returns>是否爲空</returns>
		public static bool isNullOrEmpty (this string s) {
			return string.IsNullOrEmpty (s);
		}

		/// <summary>
		/// 字符串或其他類型轉爲日期時間對象
		/// </summary>
		/// <param name="o">需要轉換的對象</param>
		/// <returns>日期時間類型</returns>
		public static DateTime toDateTime(this object o) {
			try {
				return Convert.ToDateTime(o);
			} catch (Exception ex) {
				throw ex;
			}
		}

		/// <summary>
		/// 格式化小數
		/// </summary>
		/// <param name="o">需要格式化小數的對象</param>
		/// <param name="afterPoint">保留小數點後幾位</param>
		/// <returns>字符串型數據</returns>
		public static string formatDecimal(this object o, int afterPoint = 2) {
			try {
				return string.Format(string.Format("{{0:F{0}}}", afterPoint), o);
			} catch (Exception ex) {
				throw ex;
			}
		}

		/// <summary>
		/// 格式化日期
		/// </summary>
		/// <param name="o">需要格式化的日期</param>
		/// <param name="sDate">日期分隔符</param>
		/// <returns>字符串</returns>
		public static string formatDate(this DateTime o, char sDate = '-') {
			if (o == null) return "";
			return o.ToString(string.Format("yyyy{0}MM{0}dd", sDate));
		}

		/// <summary>
		/// 格式化日期(漢字)
		/// </summary>
		/// <param name="o">需要格式化的日期</param>
		/// <returns>字符串</returns>
		public static string formatDateLong(this DateTime o) {
			if (o == null) return "";
			return o.ToString("yyyy年MM月dd日");
		}

		/// <summary>
		/// 格式化時間
		/// </summary>
		/// <param name="o">需要被格式化的時間</param>
		/// <param name="sTime">分隔符,默認冒號</param>
		/// <returns>格式化後的時間</returns>
		public static string formatTime (this DateTime o, char sTime = ':') {
			if (o == null) return "";
			return o.ToString (string.Format ("HH{0}mm{0}ss", sTime));
		}

		/// <summary>
		/// 格式化時間(漢字)
		/// </summary>
		/// <param name="o">需要被格式化的時間</param>
		/// <returns>格式化後的時間</returns>
		public static string formatTimeLong (this DateTime o) {
			if (o == null) return "";
			return o.ToString ("HH時mm分ss秒");
		}

		/// <summary>
		/// 格式化日期時間
		/// </summary>
		/// <param name="o">需要格式化的日期時間</param>
		/// <param name="sDate">日期分隔符</param>
		/// <param name="sTime">時間分隔符</param>
		/// <returns>字符串</returns>
		public static string formatDateTime(this DateTime o, char sDate = '-', char sTime = ':') {
			if (o == null) return "";
			return string.Format ("{0} {1}", o.formatDate (sDate), o.formatTime (sTime));
		}

		/// <summary>
		/// 格式化日期時間(漢字)
		/// </summary>
		/// <param name="o">需要格式化的日期時間</param>
		/// <returns>字符串</returns>
		public static string formatDateTimeLong(this DateTime o) {
			if (o == null) return "";
			return string.Format ("{0} {1}", o.formatDateLong (), o.formatTimeLong ());
		}

		/// <summary>
		/// 將布爾值轉爲字符串
		/// </summary>
		/// <param name="b">布爾值</param>
		/// <returns>字符串</returns>
		public static string boolToString (this bool b) {
			try {
				return b ? "ok" : "fealure";
			} catch (Exception ex) {
				return ex.Message;
			}
		}

		/// <summary>
		/// 將一個對象序列化爲json字符串
		/// </summary>
		/// <param name="o">可序列化對象</param>
		/// <returns>json字符串</returns>
		public static string toJson (this object o) {
			try {
				if (o == null) return "[]";
				return new JavaScriptSerializer ().Serialize (o);
			} catch (Exception ex) {
				return ex.Message;
			}
		}

		/// <summary>
		/// 將json字符串反序列化爲一個對象
		/// </summary>
		/// <typeparam name="T">返回值類型</typeparam>
		/// <param name="s">json字符串</param>
		/// <returns>反序列化後的對象</returns>
		public static T fromJson<T> (this string s) {
			try {
				if (s.isNullOrEmpty ()) return default (T);
				return new JavaScriptSerializer ().Deserialize<T> (s);
			} catch (Exception ex) {
				throw ex;
			}
		}

		/// <summary>
		/// 用於可能爲空的對象轉字符串,避免對象爲空引發的錯誤
		/// </summary>
		/// <param name="o">object對象</param>
		/// <returns>字符串</returns>
		public static string toString (this object o) {
			if (o == null) return "";
			return o.ToString ();
		}

		/// <summary>
		/// 向上取整
		/// </summary>
		/// <param name="n">浮點數</param>
		/// <returns>計算結果</returns>
		public static int cell (this double d) {
			int i = (int) d;
			if (d > i)
				return i + 1;
			return i;
		}

		/// <summary>
		/// 向下取整
		/// </summary>
		/// <param name="n">浮點數</param>
		/// <returns>計算結果</returns>
		public static int floor (this double d) {
			return (int) d;
		}

		//供ID檢查用
		private static Func<char, bool> isSign = c => (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');

		/// <summary>
		/// 檢查是否爲標準32位ID格式
		/// </summary>
		/// <param name="s">ID</param>
		/// <returns>是否標準</returns>
		public static bool isId32 (this string s) {
			if (s.isNullOrEmpty () || s.Length != 32) return false;
			for (int i = 0; i < s.Length; i++) {
				if (!isSign (s[i])) return false;
			}
			return true;
		}

		/// <summary>
		/// 檢查是否爲標準36位ID格式
		/// </summary>
		/// <param name="s">ID</param>
		/// <returns>是否標準</returns>
		public static bool isId36 (this string s) {
			if (s.isNullOrEmpty () || s.Length != 36) return false;
			for (int i = 0; i < s.Length; i++) {
				if (i == 8 || i == 13 || i == 18 || i == 23) {
					if (s[i] != '-') return false;
				} else {
					if (!isSign (s[i])) return false ;
				}
			}
			return true;
		}
	}
}
源代碼中建個類ExtensionMethods,並在其中加入擴展方法,就能使用了。上面的代碼用法如下:

string[] ss;//字符串數組,其他類型也行
string s;//字符串

//返回某個對象在對象數組中的索引
int index = s.inArray(ss);//返回字符串在字符串數組中的索引
int index2 = ss.inArray(s);//效果同上

//字符串轉碼
string encoded = "http://www.xxx.com".encodeUrl();//轉碼,生成的效果類似於:http%3a%2f%2fwww.xxx.com

//字符串格式化
string formated = "aaaa{0}cccc".format("111");//生成的效果爲:aaaa111cccc

//格式轉換
int intval = "45".toInt32();//值爲45
Int64 int64val = "4234892374872344".toInt64();//值爲4234892374872344
double dbval = "3.14159".toDouble();//值爲3.14159
DateTime dt = "2008-08-08".toDateTime();//將字符串轉爲日期時間對象

//加密
string password = "admin888".md5Encrypt();//值爲如下格式:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,其中X爲16進制數

//字符串拼接
s = ss.join();//假如ss爲{"a", "b"},那麼s值爲:a;b,默認爲分號分割

bool b = s.isNullOrEmpty();//如果s等於null或者s的長度爲0,則返回true

string decimalstr = dbval.formatDecimal();//將浮點數據轉爲字符串,默認保留2位小數,可自定義保留多少位小數

//看上面的代碼估計大家都會使用了,其他調用代碼省略……

上面是用法簡單介紹。關於toJson與fromJson兩個序列化有關操作,需要注意的是json鍵與C#類的公有屬性必須一一對應。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章