在工作中經常會遇到 驗證String 中的值是否屬於Int型或者是Bool又或是Date
一般的做法是用方法 類型.TryParse(string,類型) 來做驗證.
string strValue = "123";
int intValue;
bool isInt = int.TryParse(strValue, out intValue);
但是使用此方法需要創建一個該類型的變量.我工作中寫的是WEB程序經常一個頁面要驗證來自前台的值類型有10幾個,這樣就略顯有點麻煩了. 因為我們只要判斷下string的值是不是這個類型就好.
我發現這個TryParse方法基本 bool int date 這些類型都會存在 但是查找了下他們的接口裡均沒有此方法.又查詢了一遍IConvertible接口子類發現所有子類均存在此方法
於是就用想法給String 加上一個名為 Is的擴展方法
因為 TryParse 方法不是實現接口定義的。而C#系統類庫中實現IConvertible接口的幾乎都有TryParse 方法我們就定義類型T是繼承IConvertible的;
但也有可能類型T沒有TryParse 方法或者方法簽名不是string,out T
這種情況下我們拋出一個自定義異常 TryParseException
還有一點要注意使用反射查找 TryParse 方法時指定方法的參數類型為 {typeof(string),typeof(T)}查詢結果是NULL 因為 TryParse 的第二個參數聲明是 out 的,要使用{typeof(string),typeof(T).MakeByRefType()}才能查找到該方法
/// <summary> /// TypeValidate 的摘要說明 /// </summary> public static class TypeValidate { /// <summary> /// 類型T必須具備 /// (1)無參構造方法 /// (2)方法簽名為 bool TryParse(string,T)的方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value"></param> /// <returns></returns> [SecuritySafeCritical] public static bool Is<T>(this string value) where T : IConvertible { var type = typeof(T); Type[] types = { typeof(string), type.MakeByRefType() }; var Method = type.GetMethod("TryParse", types); if (Method == null) { throw new TryParseException(); } try { T Convertible = Activator.CreateInstance<T>(); return (bool)Method.Invoke(Convertible, new object[] { value, Convertible }); } catch { throw new TryParseException(); } } } /// <summary> /// 類型沒有方法 TryParse 或 沒有無參構造方法 或沒有方法簽名 bool TryParse(String,T)的方法 /// </summary> public class TryParseException : Exception { }
本欄目