轉帖|其它|編輯:郝浩|2011-09-20 14:19:48.000|閱讀 607 次
概述:C#類型轉換器的實現是如何的呢?具體的操作是什么呢?那么這里就向你介紹C#類型轉換器的實現需要重寫四個方法,下面我們來具體看看細節是如何操作的。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
C#類型轉換器的實現是如何的呢?具體的操作是什么呢?那么這里就向你介紹C#類型轉換器的實現需要重寫四個方法,下面我們來具體看看細節是如何操作的。
C#類型轉換器的實現所用重寫的方法:
◆CanConvertFrom()――根據類型參數進行測試,判斷是否能從這個類型轉換成當前類型,在本例中我們只提供轉換string和InstanceDescriptor類型的能力。
◆CanConvertTo()――根據類型參數進行測試,判斷是否能從當前類型轉換成指定的類型。
◆ConvertTo()――將參數value的值轉換為指定的類型。
◆ConvertFrom()――串換參數value,并返回但書類型的一個對象。
C#類型轉換器的實現實例:
1. p?u?b?l?i?c o?v?e?r?r?i?d?e o?b?j?e?c?t ?C?o?n?v?e?r?t?T?o?(? ?
2. I?T?y?p?e?D?e?s?c?r?i?p?t?o?r?C?o?n?t?e?x?t? ?c?o?n?t?e?x?t?,? ?
3. ?S?y?s?t?e?m?.?G?l?o?b?a?l?i?z?a?t?i?o?n?.?C?u?l?t?u?r?e?I?n?f?o? ?c?u?l?t?u?r?e?,? ? ?
4. o?b?j?e?c?t ?v?a?l?u?e?,? ?T?y?p?e? ?d?e?s?t?i?n?a?t?i?o?n?T?y?p?e?)? ?
5. {? ?
6. S?t?r?i?n?g? ?r?e?s?u?l?t? ?=? "?";? ?
7. i?f ?(?d?e?s?t?i?n?a?t?i?o?n?T?y?p?e? ?=?=? t?y?p?e?o?f(?S?t?r?i?n?g?)?)? ?
8. {? ?
9. S?c?o?p?e? ?s?c?o?p?e? ?=? ?(?S?c?o?p?e?)?v?a?l?u?e?;? ?
10. r?e?s?u?l?t? ?=? ?s?c?o?p?e?.?M?i?n?.?T?o?S?t?r?i?n?g?(?)?+"?,?" ?+? ?s?c?o?p?e?.?M?a?x?.?T?o?S?t?r?i?n?g?(?)?;? ?
11. r?e?t?u?r?n ?r?e?s?u?l?t?;? ?
12.
13. }? ?
14.
15. i?f ?(?d?e?s?t?i?n?a?t?i?o?n?T?y?p?e? ?=?=? t?y?p?e?o?f(?I?n?s?t?a?n?c?e?D?e?s?c?r?i?p?t?o?r?)?)? ?
16. {? ?
17. C?o?n?s?t?r?u?c?t?o?r?I?n?f?o? ?c?i? ?=? ? ?
18. t?y?p?e?o?f(?S?c?o?p?e?)?.?G?e?t?C?o?n?s?t?r?u?c?t?o?r?(? ?
19. n?e?w ?T?y?p?e?[?]? ?{t?y?p?e?o?f(?I?n?t?3?2?)?,t?y?p?e?o?f(?I?n?t?3?2?)? ?}?)?;? ?
20. S?c?o?p?e? ?s?c?o?p?e? ?=? ?(?S?c?o?p?e?)?v?a?l?u?e?;? ?
21. r?e?t?u?r?n n?e?w ?I?n?s?t?a?n?c?e?D?e?s?c?r?i?p?t?o?r?(? ?
22. c?i?,? n?e?w o?b?j?e?c?t[?]? ?{? ?s?c?o?p?e?.?M?i?n?,?s?c?o?p?e?.?M?a?x? ?}?)?;? ?
23. }? ?
24. r?e?t?u?r?n b?a?s?e.?C?o?n?v?e?r?t?T?o?(?c?o?n?t?e?x?t?,? ? ?
25. c?u?l?t?u?r?e?,? ?v?a?l?u?e?,? ?d?e?s?t?i?n?a?t?i?o?n?T?y?p?e?)?;? ?
26. }? ?
上面是ConvertTo的實現,如果轉換的目標類型是string,我將Scope的兩個屬性轉換成string類型,并且用一個“,”連接起來,這就是我們在屬性瀏覽器里看到的表現形式,如圖:
如果轉換的目標類型是實例描述器(InstanceDescriptor,它負責生成實例化的代碼),我們需要構造一個實例描述器,構造實例描述器的時候,我們要利用反射機制獲得Scope類的構造器信息,并在new的時候傳入Scope實例的兩個屬性值。實例描述器會為我們生成這樣的代碼:this.myListControl1.Scope = new CustomControlSample.Scope(10, 200);在最后不要忘記調用 base.ConvertTo(context, culture, value, destinationType),你不需要處理的轉換類型,交給基類去做好了。
1. p?u?b?l?i?c o?v?e?r?r?i?d?e o?b?j?e?c?t ?C?o?n?v?e?r?t?F?r?o?m?(? ?
2. I?T?y?p?e?D?e?s?c?r?i?p?t?o?r?C?o?n?t?e?x?t? ?c?o?n?t?e?x?t?,? ? ?
3. S?y?s?t?e?m?.?G?l?o?b?a?l?i?z?a?t?i?o?n?.?C?u?l?t?u?r?e?I?n?f?o? ?c?u?l?t?u?r?e?,? ? ?
4. o?b?j?e?c?t ?v?a?l?u?e?)? ?
5. {? ?
6. i?f ?(?v?a?l?u?e? i?s s?t?r?i?n?g)? ?
7. {? ?
8. S?t?r?i?n?g?[?]? ?v? ?=? ?(?(?S?t?r?i?n?g?)?v?a?l?u?e?)?.?S?p?l?i?t?('?,?')?;? ?
9. i?f ?(?v?.?G?e?t?L?e?n?g?t?h?(?0?)? ?!?=? ?2?)? ?
10. {? ?
11. t?h?r?o?w n?e?w ?A?r?g?u?m?e?n?t?E?x?c?e?p?t?i?o?n?(? ?
12. "?I?n?v?a?l?i?d? ?p?a?r?a?m?e?t?e?r? ?f?o?r?m?a?t?")?;? ?
13. }? ?
14.
15. S?c?o?p?e? ?c?s?f? ?=? n?e?w ?S?c?o?p?e?(?)?;? ?
16. c?s?f?.?M?i?n? ?=? ?C?o?n?v?e?r?t?.?T?o?I?n?t?3?2?(?v?[?0?]?)?;? ?
17. c?s?f?.?M?a?x? ?=? ?C?o?n?v?e?r?t?.?T?o?I?n?t?3?2?(?v?[?1?]?)?;? ?
18. r?e?t?u?r?n ?c?s?f?;? ?
19. }? ?
20. r?e?t?u?r?n b?a?s?e.?C?o?n?v?e?r?t?F?r?o?m?(?c?o?n?t?e?x?t?,? ?c?u?l?t?u?r?e?,? ?v?a?l?u?e?)?;? ?
21. }? ?
22. }? ?
上面是ConvertFrom的代碼,由于系統能夠直接將實例描述器轉換為Scope類型,所以我們就沒有必要再寫代碼,我們只需要關注如何將 String(在屬性瀏覽出現的屬性值的表達)類型的值轉換為Scope類型。沒有很復雜的轉換,只是將這個字符串以“,”分拆開,并串換為Int32類型,然后new一個Scope類的實例,將分拆后轉換的兩個整型值賦給Scope的實例,然后返回實例。在這段代碼里,我們要判斷一下用戶設定的屬性值是否有效。比如,如果用戶在Scope屬性那里輸入了“10200”,由于沒有輸入“,”,我們無法將屬性的值分拆為兩個字符串,也就無法進行下面的轉換,所以,我們要拋出一個異常,通知用戶重新輸入。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載