日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我的KT库之-----扩展方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

了解或者認(rèn)識(shí)KT:

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

?????

在項(xiàng)目中如何使用KT?

???? KT是一個(gè)庫(kù),所以將KT的dll文件引用到您的項(xiàng)目上即可使用KT里的函數(shù)功能。

本節(jié)將介紹大家認(rèn)識(shí)KT庫(kù)里的擴(kuò)展方法和如何去使用擴(kuò)展方法。KT里的擴(kuò)展方法存放在“KT.Core.Extensions“下,當(dāng)你已在你的項(xiàng)目里引用了KT庫(kù)后,則寫(xiě)下以下代碼就可以使用到KT里的所有擴(kuò)展方法了。

using KT.Core.Extensions;

目前KT庫(kù)只針對(duì)“Object”、“String”、“DateTime”、“IDictionary”,“NameValueCollection”等對(duì)象數(shù)據(jù)進(jìn)行了方法擴(kuò)展。

A、Object的擴(kuò)展方法

1)、As<T>方法 : 萬(wàn)能轉(zhuǎn)換方法

????? 將某種類型的數(shù)據(jù)轉(zhuǎn)換為另外一種類型數(shù)據(jù),如果轉(zhuǎn)換失敗則返回對(duì)應(yīng)類型的默認(rèn)值,如下示例代碼:

?????

??????????? 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>擴(kuò)展方法有點(diǎn)類似于as操作符與Convert類的結(jié)合體。但As<T>和Convert類又有幾點(diǎn)不同。

A)、如果類型轉(zhuǎn)換失敗,As<T>擴(kuò)展不會(huì)拋出任何的錯(cuò)誤,只是返回對(duì)應(yīng)類型的默認(rèn)值。如上面例子中的“l(fā)ong l = value.As<long>();“,因?yàn)閚ull無(wú)法轉(zhuǎn)換為long類型,所以返回long類型的默認(rèn)值“0”。

B)、支持轉(zhuǎn)換為枚舉類型。如上例中將“Friday”字符串轉(zhuǎn)換為DayofWeek枚舉,如果轉(zhuǎn)換失敗,則返回枚舉定義中的第一個(gè)項(xiàng)!

注:此方法還有一個(gè)重載方法,即是多了一個(gè)默認(rèn)值參數(shù),當(dāng)轉(zhuǎn)換失敗時(shí)返回方法傳遞的默認(rèn)值。如下示例:

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

因?yàn)関alue=null,無(wú)法轉(zhuǎn)換為long類型的值,所以返回-1L。

2)、ToJson方法: 將對(duì)象解析為Json格式的字符串

如果對(duì)象值為DateTime則返回一個(gè)JavaScript腳本的Date對(duì)象;如果是字符串,則對(duì)于非英文字母、數(shù)字的字符,將解析為“\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());

運(yùn)行后,將輸出以下數(shù)據(jù):

{"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>方法:如果對(duì)象為null則調(diào)用委托方法。

有時(shí)我們會(huì)經(jīng)常這樣做if條件判斷:

??????? static void GetCurrentUserData(User user)
??????? {
???????????
if (user == null)
??????????? {
???????????????
//如果user為null則獲取當(dāng)前會(huì)話的用戶
??????????????? user = GetCurrentContextUser();
??????????? }
???????????
//其它操作代碼
??????? }

有了此IfNull<T>擴(kuò)展方法后,我們就可以省去此if了,可以直接寫(xiě)成這樣:

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

B、String的擴(kuò)展方法

1)、MD5方法:采用UTF-8編碼獲取字符串的MD5哈希值(小寫(xiě)輸出)

示例代碼:

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

注:此方法有一個(gè)重載方法,用于設(shè)置求取MD5哈希值時(shí)使用的文本編碼。如上例代碼,對(duì)于漢字,如果采用不同編碼獲取到的哈希值是不同的。

2)、IfEmpty方法:如果字符串為null或空字符值,則返回替代值或調(diào)用委托函數(shù)獲取新值,類似于Object的IfNull<T>方法

3)、IsInteger方法:判斷字符串是否都是由阿拉伯?dāng)?shù)字組成的,即是否由(0-9)數(shù)字組成的字符串

4)、IsDateTime方法:判斷是否是日期時(shí)間格式的字符串

5)、IsValidEmail方法:判斷字符串的格式是否是郵件地址格式(注:此方法判斷的郵件格式要求較寬松,只要符合XXX@XXX.XX格式的都會(huì)認(rèn)為符合)

6)、IsMatch方法:判斷字符串是否符合某種正則表達(dá)式的模式格式,如下面代碼就是IsInteger方法的實(shí)現(xiàn):

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

7)、IsContain方法:判斷字符串中是否包含有某個(gè)分隔項(xiàng)。示例代碼:

??????????? 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

注:此方法有一個(gè)重載方法,用于指示判斷時(shí)是否區(qū)分大小寫(xiě)

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

???? 此方法有幾種不同的重載方法。

???? a)、是否不區(qū)分大小寫(xiě)替換,示例代碼:

"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轉(zhuǎn)換示例
??????????? 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腳本里的字符串,對(duì)于非英文字母、數(shù)字的字符將格式為“\uxxxx”格式的字符。

10)、ConvertTo方法:將字符串值轉(zhuǎn)換為其它類型。此方法是Object里的As<T>方法的核心方法。

11)、ReadAllLines方法:將字符串按行讀取,并返回所有行數(shù)據(jù)數(shù)組。

C、DateTime的擴(kuò)展方法

1)、ToTimestamp方法:獲取某個(gè)日期時(shí)間的時(shí)間戳值,時(shí)間戳值的計(jì)算是從1970-01-01 0:0:0開(kāi)始計(jì)算的總毫秒數(shù)

2)、FromTimestamp方法:將某個(gè)時(shí)間戳值轉(zhuǎn)換為當(dāng)前時(shí)間值。

3)、ToRFC822Time方法:獲取某個(gè)日期時(shí)間的RFC822定義的格式字符串,此格式時(shí)間在郵件交互里經(jīng)常使用到。如"Thu, 21 Dec 2000 16:01:07 +0800"

D、IDictionary的擴(kuò)展方法

1)、GetOrDefault方法: 從IDictionary對(duì)象里獲取數(shù)據(jù),如果沒(méi)有數(shù)據(jù)則返回一個(gè)默認(rèn)的值

2)、GetOrAdd方法: 從IDictionary對(duì)象里獲取數(shù)據(jù),如果沒(méi)有數(shù)據(jù)則調(diào)用委托獲取數(shù)據(jù)并添加到集合后返回。示例代碼:

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

E、NameValueCollection的擴(kuò)展方法

1)、Get<T>方法: 從NameValueCollection獲取某個(gè)值,并且轉(zhuǎn)換為對(duì)應(yīng)類型,如果轉(zhuǎn)換失敗返回默認(rèn)值

2)、TrimGet<T>方法:從NameValueCollection獲取某個(gè)值,并去掉值的前后空白后轉(zhuǎn)換為對(duì)應(yīng)類型,如果轉(zhuǎn)換失敗則返回默認(rèn)值。

示例代碼:

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里的所有數(shù)據(jù)復(fù)制到某個(gè)對(duì)象中

假如我們的Web表格里提交了如下數(shù)據(jù):

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());

運(yùn)行以上代碼后,user里的各個(gè)屬性字段將對(duì)應(yīng)取得上面提交的值。

?

?

好了,目前KT里的擴(kuò)展方法只提供了這么多,雖然少,但卻都是非常有用的功能函數(shù)。如果你有更好的擴(kuò)展方法或建議,希望你能加入到KT項(xiàng)目的更新開(kāi)發(fā)中來(lái):)

?

轉(zhuǎn)載于:https://www.cnblogs.com/kingthy/archive/2011/08/08/2131148.html

總結(jié)

以上是生活随笔為你收集整理的我的KT库之-----扩展方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。