了解或者认识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方法:判断字符串的格式是否是邮件地址格式(注:此方法判断的邮件格式要求较宽松,只要符合[email protected]格式的都会认为符合)
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项目的更新开发中来:)