c# 扩展方法 泛型方法

 最近看书看到了一个扩展方法的例子,也来谈下自己的感悟

 有时候在写代码过程中,发现定义一些方法会很方便的操作一个对象,

 比如  用 Request.QueryString[""]  接收一个get 传值, 你一定要进行一些判断操作

 

 1 判断对象是不是为 null

   

if(Request.QueryString[""]!=null)
{
// do something
}

 

2 如果需要对获取值进行类型转化   比如 值类型的装箱

if(Request.QueryString[""]!=null)
{

if(Int32.TryParse(Request.QueryString[""].toString(),out int n)
{
// do something
}
}


当然还会有一些字符串的过滤操作
其实完全可以定义一个扩展方法 封装一些这些操作

c# 扩展方法 是在静态类中定义的静态方法,允许你用实例方法的语法来调用

这里要为 Request.QueryString 定义一个 TryGetValue 扩展
Request.QueryString类型为 NameValueCollection   在 System.Collections.Specialized; 命名空间下
定义一个扩展方法 要在第一个参数 即 要扩展的方法实例参数 添加 this

 1     public static class ExtendClass
2 {
3
4 public static bool TryGetValue(this NameValueCollection queryString, string queryName, out String queryValue)
5 {
6 bool isqueryName = false;
7 queryValue = String.Empty;
8
9 if (queryString.GetValues(queryName) != null)
10 {
11 isqueryName = true;
12 queryValue = queryString.GetValues(queryName)[0];
13 }
14
15 return isqueryName;
16 }
17 }

 

直接调用

            String squery = String.Empty;
if (Request.QueryString.TryGetValue("s", out squery))
Response.Write(squery);


万一传值需要转换成 值类型呢 所以还得有一个  重载方法

 1         public static bool TryGetValue(this NameValueCollection queryString, string queryName, out Int32 queryValue)
2 {
3 bool isqueryName = false;
4 queryValue = 0;
5
6 if (queryString.GetValues(queryName) != null)
7 {
8 isqueryName = true;
9 Int32.TryParse(queryString.GetValues(queryName)[0], out queryValue);
10 }
11
12 return isqueryName;
13 }

 

这样我们定义了两个方法 ,但是他们参数相同,只是类型不同而已,这样 就能考虑泛型方法了

代码如下

 1         ///<summary>
2 /// QueryString 值判断获取
3 ///</summary>
4 ///<param name="queryString"></param>
5 ///<param name="queryName">
6 /// 参数名称
7 ///</param>
8 ///<param name="queryValue">
9 /// 返回的参数值
10 ///</param>
11 ///<returns></returns>
12 public static bool TryGetValue<T>(this NameValueCollection queryString, string queryName, out T queryValue)
13 {
14 bool isqueryName = false;
15 queryValue = default(T);
16
17 if (queryString.GetValues(queryName)!=null)
18 {
19 isqueryName = true;
20 try
21 {
22 queryValue = (T)Convert.ChangeType(queryString.GetValues(queryName)[0], typeof(T));
23 }
24 catch
25 {}
26 }
27
28 return isqueryName;
29 }

 

调用如下

            Int32 iquery = 0;

if (Request.QueryString.TryGetValue<Int32>("q", out iquery))
Response.Write(iquery);




有了泛型的  类型推演 特性,也可以这样调用

 

            Int32 iquery = 0;

if (Request.QueryString.TryGetValue("q", out iquery))
Response.Write(iquery);

 



posted on 2011-11-27 09:24  havid  阅读(1907)  评论(0编辑  收藏  举报

导航