程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 對String進行類型驗證的幫助類

對String進行類型驗證的幫助類

編輯:關於.NET

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

本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved