擴展方法是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#類的公有屬性必須一一對應。