使用泛型打造Request工具类

Heero.Luo发表于14年前,已被查看1362次

在ASP.NET页面中可以使用Request对象获取指定参数的值,例如:

string value = Request["id"];

参数值都是string类型,但是进行处理的时候可能要转换成数字、日期等类型。

string value = Request["id"];
int id = Int32.Parse(value);

实际应用的时候还要考虑异常的情况。

string value = Request["id"];
int id;
Int32.TryParse(value, out id);

如果每个页面都这么写,显得非常麻烦,代码重复也很严重,还是封装成一个工具类吧。

public class ReqHelper
{
	public static string GetString(string paramName) { ... }
	public static int GetInt(string paramName) { ... }
	public static bool GetBool(string paramName) { ... }
	...
}

虽然原始类型是有限的,但是对每个类型写一个方法,还是显得臃肿了。其实这多个方法,区别只在于返回值类型。有没有办法把类型作为参数,让方法返回特定类型的值呢?答案是有的,那就是泛型

public class ReqHelper
{
	public static T Get<T>(string paramName) {
		string value = HttpContext.Current.Request.Form[paramName];
		Type type = typeof(T);
		return (T)Convert.ChangeType(value, type);
	}
}

T是在调用的时候才被指定,也就相当于类型参数。最后要考虑的还是异常处理,TryParse方法在转换出错的时候会输出该类型的默认值,这里也可以参考这种做法,但问题是如何获取未知类型T的默认值。其实在C#中已经提供这样一个关键字,那就是default。最终代码如下:

public class ReqHelper
{
	public static T Get<T>(string paramName) {
		string value = HttpContext.Current.Request.Form[paramName];
		Type type = typeof(T);
		object result;
		try
		{
			result = Convert.ChangeType(value, type);
		}
		catch
		{
			result = default(T);
		}
		return (T)result;
	}
}

调用方法:

int id = ReqHelper.Get<int>("id");

评论 (1条)

发表评论

(必填)

(选填,不公开)

(选填,不公开)

(必填)