我的KT库之-----扩展方法
了解或者認(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)換方法
????? 將某種類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為另外一種類(lèi)型數(shù)據(jù),如果轉(zhuǎn)換失敗則返回對(duì)應(yīng)類(lèi)型的默認(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)類(lèi)似于as操作符與Convert類(lèi)的結(jié)合體。但As<T>和Convert類(lèi)又有幾點(diǎn)不同。
A)、如果類(lèi)型轉(zhuǎn)換失敗,As<T>擴(kuò)展不會(huì)拋出任何的錯(cuò)誤,只是返回對(duì)應(yīng)類(lèi)型的默認(rèn)值。如上面例子中的“l(fā)ong l = value.As<long>();“,因?yàn)閚ull無(wú)法轉(zhuǎn)換為long類(lèi)型,所以返回long類(lèi)型的默認(rèn)值“0”。
B)、支持轉(zhuǎn)換為枚舉類(lèi)型。如上例中將“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類(lèi)型的值,所以返回-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ì)話的用戶(hù)
??????????????? 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ù)獲取新值,類(lèi)似于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("用戶(hù):[姓名],今年[年齡]歲,婚姻狀況:[婚否]".Replace(items, "[", "]"));?? //輸出:“用戶(hù):張三,今年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)換為其它類(lèi)型。此方法是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)類(lèi)型,如果轉(zhuǎn)換失敗返回默認(rèn)值
2)、TrimGet<T>方法:從NameValueCollection獲取某個(gè)值,并去掉值的前后空白后轉(zhuǎn)換為對(duì)應(yīng)類(lèi)型,如果轉(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)題。
- 上一篇: 解题报告 poj 2109
- 下一篇: 添加水印(文字and图片)