在工作中經常會遇到 驗證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
{
}
本欄目