程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c# 用反射實現winform界面動態存儲理論知識

c# 用反射實現winform界面動態存儲理論知識

編輯:C#入門知識

1 概述
在數據庫管理軟件開發過程中,個性化的界面設計是一個成功軟件產品必不可少的重要組成部分,定制界面設計就是界面控件的布局、控件屬性的設置,當然 要考慮界面控件的合理存儲的問題。但是傳統的軟件界面設計為了滿足客戶的需求,程序員需要開發出各種各樣的用戶界面,這樣既提高軟件的開發成本,也浪費大 量的人力和物力,其實那些界面功能大致相同,只是表現形式不同。
本文提出一種使用反射技術獲取運行時的界面控件屬性的可行性方法,解決了界面的動態存儲問題,避免了軟件界面的重復開發,提高了軟件的開發效率。
2 反射機制
C#.Net提供的反射機制,再結合自適應數據參數的傳遞,可以將應用框架中的擴展點以插件式程序集的方式來動態加載和構建,從而實現可動態擴展的 應用程序。
2.1 反射機制的基本原理
反射是C#.Net中獲取運行時類型信息的方式。C#.Net的應用程序由程序集(Assembly)、模塊(Module)和類型(class) 組成,反射提供一種編程的方式,讓程序員可以在程序運行時獲得這幾部分的相關信息。如在運行時獲得C#.Net中每一個類型(包括類、結構、委托、接口和 枚舉等)的成員屬性、成員方法、事件和構造函數等。還可以獲得每個成員的名稱、限定符和參數。
2.2 反射機制類的層次
C#.Net反射API實際上是一種類的數據結構。圖1中顯示了這種結構的一部分——這是在命名空間System.Reflection定義的。這 些類能夠在邏輯上遍歷組合體和類型信息,可以在這個層次結構的任何位置開始,這取決於應用程序的具體設計需要。
2.3 反射機制的作用
應用程序結構分為應用程序域、程序集、模塊、類型、成員幾個層次。公共語言運行庫加載器管理應用程序域,這種管理包括將每個程序集加載到相應的應用 程序域以及控制每個程序集中類型層次結構的內存布局。
程序集包含模塊,而模塊包含類型,類型又包含成員,反射則提供了封裝程序集、模塊和類型的對象。可以使用反射動態地創建類型的實例,將類型綁定到現 有對象或從現有對象中獲取類型,然後調用類型的方法或訪問其字段和屬性。
反射通常具有以下用途:①使用Assembly定義和加載程序集,加載在程序集清單中列出的模塊,以及從程序集中查找類型並創建該類型的實例;②使 用Module了解包含模塊的程序集以及模塊中的類等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法;③使用MethodInfo了解方 法的名稱、返回類型、參數、訪問修飾符(如pulic 或private)和實現詳細信息(如abstract或virtual)等;④使用FiedInfo了解字段的名稱、訪問修飾符和實現詳細信息(如 static)等,並獲取或設置字段值;⑤使用EventInfo了解事件的名稱、事件處理程序數據類型、自定義屬性、聲明類型和反射類型等,添加或移除 事件處理程序;⑥使用PropertyInfo了解屬性的名稱、數據類型、聲明類型、反射類型、只讀或可寫狀態等。
3 軟件界面的動態存儲
界面的動態存儲是指通過軟件的工具箱與屬性窗口來定制軟件界面,界面中所有控件都是窗體的對象,當存儲界面時,使用C#.Net反射技術來動態獲取 綁定對象的屬性,並且存儲在XML文件中。
3.1 動態存儲的存儲格式
需要解決數據采用何種存儲格式。XML目前正在成為各種數據庫特別是文檔的首選格式,由於其具有標記不同字段的能力,使得數據存儲變得更簡單和動態化,而且文件的XML存儲系統簡單並容易實現。所以,存儲格式采用XML格式。
3.2 動態存儲的實現原理
在C#.Net FrameWork 開發平台中,窗體(即用戶看到的軟件界面)是一個容器型控件,可以在窗體中添加各類控件(如 Button按鈕、TextBox文本框以及其他容器型控件)。軟件設計者在設計應用程序的用戶界面時,通常先靜態創建一個窗體,然後在窗體中根據功能需 求來添加控件、設置屬性、創建事件處理程序,以及向窗體添加業務邏輯等。在C#.Net環境中,容器型控件中各控件對象的動態布局都是由相應對象的屬性來 決定的,其中對象屬性包括屬性名以及對應的屬性值,通過C#.Net反射機制來動態捕獲定制界面中各對象擁有的屬性,而且把屬性名和屬性值使用迭代的方法 分別保存到動態數組中,然後把屬性名作為標記,把屬性值作為標記的內容,通過循環的方法將屬性的數據序列化成XML格式
3.3 動態存儲的具體實現
由於界面由許多控件組成,相應的程序設計也比較復雜,為了敘述的簡便,這裡以軟件界面只有Button控件為例來說明界面動態存儲的具體實現。
使用C#環境實現軟件界面動態存儲,首先要創建一個工程項目,然後在窗體上拖放一個Button控件。此時,Button控件就成為窗體的一個對象,這裡給此窗體起名為UIDesigner,Button對象起名為button1。接著需要利用“屬性窗口”對Button對象設置相應的屬性。
軟件界面的Button對象完成定制設置後,就可以進行動態存儲了。對於一個界面中自定義的控件,其方法和屬性對於裝載軟件來說是不確定的。在 C#.Net平台還提供了動態加載對象和動態調用對象的方法,通過C#.Net反射技術來達到目的。實現方法為:首先在工程的命名空間中創建 ButtonObject類、Properties類、PropertyType類、PropertyTypeManager類、PropertyX類 (包括PropertyColor類、PropertyString類、PropertyBoolen類、PropertyFont類、 PropertySize類等)。其關鍵類為Properties。首先要添加相關引用 using System.Reflecttion、using System.Xml 和 using System.Xml.Serialization,然後在類中創建兩個動態數組PropertyValues[]、PropertyInfos[]。其 中,PropertyValues[]用來保存button1的屬性名/屬性值,PropertyInfos[]用來保存button1的屬性類型/屬性 全名。所使用到的類圖及其關系如圖3所示。
依據圖3最後完成程序實際。在窗體UIDesigner代碼的load_UIDesigner事件中,把button1定義為自定義 ButtonObject類的對象並實例化,然後通過圖3中⑴→⑵→⑶→⑷ 四個模塊就可以實現把界面控件的屬性提取出來,然後把它們分別保存到PropertyInfo、PropertyValue動態數組中。
4 結束語
利用C#.Net平台下反射技術、采用軟件界面動態存儲的設計思想,動態提取界面控件的屬性,以XML文件格式存儲,可以將應用框架中的擴展點以插 件式程序集的方式來動態加載和構建,從而實現可動態擴展的應用程序。實踐證明,這種方法可極大地提高軟件開發的效率,能很好地實現應用系統之間的元數據信 息動態存儲,具有較高的擴展性和代碼復用性。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved