我的KT库之-----扩展方法

简介:

了解或者认识KT:

      http://www.cnblogs.com/kingthy/archive/2011/08/08/2130973.html

     

在项目中如何使用KT?

     KT是一个库,所以将KT的dll文件引用到您的项目上即可使用KT里的函数功能。

本节将介绍大家认识KT库里的扩展方法和如何去使用扩展方法。KT里的扩展方法存放在“KT.Core.Extensions“下,当你已在你的项目里引用了KT库后,则写下以下代码就可以使用到KT里的所有扩展方法了。

using  KT.Core.Extensions;

目前KT库只针对“Object”、“String”、“DateTime”、“IDictionary”,“NameValueCollection”等对象数据进行了方法扩展。

A、Object的扩展方法

1)、As<T>方法 : 万能转换方法

      将某种类型的数据转换为另外一种类型数据,如果转换失败则返回对应类型的默认值,如下示例代码:

     

复制代码
             int  i  =   " 1 " .As < int > ();          //i = 1
            
float  f  =   " 0.22 " .As < float > ();   //f = 0.22f
            DayOfWeek dayOfWeek 
=   " Friday " .As < DayOfWeek > ();  //dayOfWeek = Friday
            DateTime time 
=   " 2011-01-01 " .As < DateTime > ();     //time = 2011-01-01
            Stream stream 
=  ( new  MemoryStream()).As < Stream > ();  //stream = MemoryStream

            
object  value  =   null ;      
            
long  l  =  value.As < long > ();            //l = 0L
复制代码

从上面的示例代码可以看出,As<T>扩展方法有点类似于as操作符与Convert类的结合体。但As<T>和Convert类又有几点不同。

A)、如果类型转换失败,As<T>扩展不会抛出任何的错误,只是返回对应类型的默认值。如上面例子中的“long l = value.As<long>();“,因为null无法转换为long类型,所以返回long类型的默认值“0”。

B)、支持转换为枚举类型。如上例中将“Friday”字符串转换为DayofWeek枚举,如果转换失败,则返回枚举定义中的第一个项!

注:此方法还有一个重载方法,即是多了一个默认值参数,当转换失败时返回方法传递的默认值。如下示例:

object  value  =   null ;
long  l  =  value.As < long > ( - 1L );  //l = -1L

因为value=null,无法转换为long类型的值,所以返回-1L。

2)、ToJson方法: 将对象解析为Json格式的字符串

如果对象值为DateTime则返回一个JavaScript脚本的Date对象;如果是字符串,则对于非英文字母、数字的字符,将解析为“\uxxxx“格式的字符。

示例代码:

复制代码
            User user  =   new  User();
            user.Age 
=   12 ;
            user.Name 
=   " 张三 " ;
            user.CreatedTime 
=  DateTime.Now;
            user.Location.Address 
=   " 广东广州 " ;
            user.Location.Zipcode 
=   " 510000 " ;
            Console.WriteLine(user.ToJson());
复制代码

运行后,将输出以下数据:

{ " Name " : " \u5f20\u4e09 " , " Age " : 12 , " CreatedTime " : new Date( 1312790227779 ), " Address " : " \u5e7f\u4e1c\u5e7f\u5dde " , " Zipcode " : " 510000 " , " Location " :{ " Address " : " \u5e7f\u4e1c\u5e7f\u5dde " , " Zipcode " : " 510000 " }}

3)、IfNull<T>方法:如果对象为null则调用委托方法。

有时我们会经常这样做if条件判断:

复制代码
         static   void  GetCurrentUserData(User user)
        {
            
if  (user  ==   null )
            {
                
// 如果user为null则获取当前会话的用户
                user  =  GetCurrentContextUser();
            }
            
// 其它操作代码
        }
复制代码

有了此IfNull<T>扩展方法后,我们就可以省去此if了,可以直接写成这样:

         static   void  GetCurrentUserData(User user)
        {
            user 
=  user.IfNull < User > (GetCurrentContextUser);
            
// 其它操作代码
        }

B、String的扩展方法

1)、MD5方法:采用UTF-8编码获取字符串的MD5哈希值(小写输出)

示例代码:

            Console.WriteLine( " 管理员 " .MD5());   // b1dae9bc5cabbc13e4bee21af11cdb8d
            Console.WriteLine( " 管理员 " .MD5(Encoding.GetEncoding( " gbk " )));   // 8178134ede762c42e41a7b1695082e28

注:此方法有一个重载方法,用于设置求取MD5哈希值时使用的文本编码。如上例代码,对于汉字,如果采用不同编码获取到的哈希值是不同的。

2)、IfEmpty方法:如果字符串为null或空字符值,则返回替代值或调用委托函数获取新值,类似于Object的IfNull<T>方法

3)、IsInteger方法:判断字符串是否都是由阿拉伯数字组成的,即是否由(0-9)数字组成的字符串

4)、IsDateTime方法:判断是否是日期时间格式的字符串

5)、IsValidEmail方法:判断字符串的格式是否是邮件地址格式(注:此方法判断的邮件格式要求较宽松,只要符合XXX@XXX.XX格式的都会认为符合)

6)、IsMatch方法:判断字符串是否符合某种正则表达式的模式格式,如下面代码就是IsInteger方法的实现:

" 0123123 " .IsMatch( @" ^\d+$ " )

7)、IsContain方法:判断字符串中是否包含有某个分隔项。示例代码:

            Console.WriteLine( " A,B,C,D " .IsContain( " A " , " , " ));    // true
            Console.WriteLine( " A,B,C,D " .IsContain( " E " " , " ));   // false
            Console.WriteLine( " A,B,C,D " .IsContain( " a " " , " ));   // false
            Console.WriteLine( " A,B,C,D " .IsContain( " a " " , " true ));   // true

注:此方法有一个重载方法,用于指示判断时是否区分大小写

8)、Replace方法:字符串替换方法

     此方法有几种不同的重载方法。

     a)、是否不区分大小写替换,示例代码:

" AbabAe " .Replace( " a " " C " true );  // CbCbCe

     b)、带前缀、后缀的整批替换(集合),示例代码:

复制代码
            Dictionary < string string >  items  =   new  Dictionary < string string > ();
            items.Add(
" 姓名 " " 张三 " );
            items.Add(
" 年龄 " " 20 " );
            items.Add(
" 婚否 " " 未婚 " );

            Console.WriteLine(
" 用户:[姓名],今年[年龄]岁,婚姻状况:[婚否] " .Replace(items,  " [ " " ] " ));    // 输出:“用户:张三,今年20岁,婚姻状况:未婚”
复制代码

    

      c)、带前缀、后缀的整批替换(委托)、示例代码:

    

复制代码
             // UBB转换示例
             string  text  =   " [b]粗体[/b][i]斜体[/i][red]红色[/red] " ;
            text 
=  text.Replace(key  =>
            {
                
switch  (key.ToLower())
                {
                    
case   " b " :
                        
return   " <strong> " ;
                    
case   " /b " :
                        
return   " </strong> " ;
                    
case   " i " :
                        
return   " <i> " ;
                    
case   " /i " :
                        
return   " </i> " ;
                    
case   " red " :
                        
return   " <font color=\"red\"> " ;
                    
case   " /red " :
                        
return   " </font> " ;
                    
default :
                        
return   null ;
                }
            }, 
" [ " " ] " );
            Console.WriteLine(text);   //输出:"<strong>粗体</strong><i>斜体</i><font color="red">红色</font>"
复制代码

9)、ToJavaScriptString方法:将字符串格式化为Javascript脚本里的字符串,对于非英文字母、数字的字符将格式为“\uxxxx”格式的字符。

10)、ConvertTo方法:将字符串值转换为其它类型。此方法是Object里的As<T>方法的核心方法。

11)、ReadAllLines方法:将字符串按行读取,并返回所有行数据数组。

C、DateTime的扩展方法

1)、ToTimestamp方法:获取某个日期时间的时间戳值,时间戳值的计算是从1970-01-01 0:0:0开始计算的总毫秒数

2)、FromTimestamp方法:将某个时间戳值转换为当前时间值。

3)、ToRFC822Time方法:获取某个日期时间的RFC822定义的格式字符串,此格式时间在邮件交互里经常使用到。如"Thu, 21 Dec 2000 16:01:07 +0800"

D、IDictionary的扩展方法

1)、GetOrDefault方法: 从IDictionary对象里获取数据,如果没有数据则返回一个默认的值

2)、GetOrAdd方法: 从IDictionary对象里获取数据,如果没有数据则调用委托获取数据并添加到集合后返回。示例代码:

            Dictionary < string string >  items  =   new  Dictionary < string string > ();
            Console.WriteLine(items.GetOrDefault(
" 姓名 " " 张三 " ));     //张三
            Console.WriteLine(items.GetOrAdd(
" 姓名 " , ()  =>   " 李四 " ));   //李四
            Console.WriteLine(items.GetOrDefault(
" 姓名 " " 张三 " ));     //李四

E、NameValueCollection的扩展方法

1)、Get<T>方法: 从NameValueCollection获取某个值,并且转换为对应类型,如果转换失败返回默认值

2)、TrimGet<T>方法:从NameValueCollection获取某个值,并去掉值的前后空白后转换为对应类型,如果转换失败则返回默认值。

示例代码:

int  i  =  Request.QueryString.Get < int > ( " id " );
string  name  =  Request.QueryString.TrimGet < string > ( " name " );
int  year  =  Request.Form.Get < int > ( " year " , 2011 );
DateTime time 
=  Request.From.Get < DateTime > ( " createdtime " ,DateTime.Now);

3)、CopyTo<T>方法:将NameValueCollection里的所有数据复制到某个对象中

假如我们的Web表格里提交了如下数据:

name=张三&age=12&location.zipcode=510000&location.city=广州&createdtime=2011-01-01 12:00:00

 

User user  =   new  User();
Request.From.CopyTo(user);
Response.Write(user.ToJson());

运行以上代码后,user里的各个属性字段将对应取得上面提交的值。

 

 

好了,目前KT里的扩展方法只提供了这么多,虽然少,但却都是非常有用的功能函数。如果你有更好的扩展方法或建议,希望你能加入到KT项目的更新开发中来:)

 

本文转自Kingthy博客园博客,原文链接:http://www.cnblogs.com/kingthy/archive/2011/08/08/2131148.html ,如需转载请自行联系原作者
相关文章
|
8月前
|
存储 Java 数据安全/隐私保护
Python----类对象和实例对象
Python----类对象和实例对象
39 2
Java-----抽象类为什么不能实例化?抽象方法为什么不能被static修饰?set和get方法的使用方法
Java-----抽象类为什么不能实例化?抽象方法为什么不能被static修饰?set和get方法的使用方法
122 0
|
8月前
|
Java
Java常用封装Base对象
Java常用封装Base对象
45 0
|
Java Kotlin
Kotlin data数据类、copy()函数、sealed密封类
Kotlin data数据类、copy()函数、sealed密封类使用
179 0
|
存储 算法 关系型数据库
Python继承及方法解析顺序(MRO)详解 | 示例与super()函数使用
Python继承及方法解析顺序(MRO)详解 | 示例与super()函数使用
298 0
|
Swift
OC 和 swift 创建单例方法
OC 和 swift 创建单例方法
338 0
ZZULIOJ-1110: 最近共同祖先(函数专题)(Java)
ZZULIOJ-1110: 最近共同祖先(函数专题)(Java)
ZZULIOJ-1110: 最近共同祖先(函数专题)(Java)
|
存储 Java C#
30天C#基础巩固----程序集,反射
30天C#基础巩固----程序集,反射
111 0
30天C#基础巩固----程序集,反射