程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> VB.NET為智能設備編寫半自動初始化類

VB.NET為智能設備編寫半自動初始化類

編輯:VB.NET

VB.NET為智能設備編寫半自動初始化類。本站提示廣大學習愛好者:(VB.NET為智能設備編寫半自動初始化類)文章只能為提供參考,不一定能成為您想要的結果。以下是VB.NET為智能設備編寫半自動初始化類正文


一、引言

關於ncf(net精簡版的英文縮寫)開發人員,使用順序選項保管普通只要兩種途徑選擇:

1、將選項的值寫入注冊表,但假如一切使用順序都將值少量寫入注冊表的做法最終將招致注冊表過大占用零碎資源,而影響零碎的運轉效率;而且這就是很多軟件在硬啟設備之後不得不重新裝置的緣由。依據古代順序編寫中"順序盡能夠與零碎獨立"的思想,這種做法不引薦運用。

2、將選項值以一個初始化文件的方式保管,這樣做可以最大限制防止零碎資源占用,進步順序運轉獨立性,這種做法團體以為是較為可取的方案。並且這種做法在.net完好版中完成十分復雜,可以直接用Xml序列化類來完成。但在專為智能挪動設備定做的net精簡版中,由於不提供XML序列化屬性,使得保管和運用順序選項變得郁悶起來。順序開發人員不得不對每一個順序選項作寫入/讀取文件的編碼,這個單調無味的步驟相對不會是一件風趣的事情。

二、功用概述

本文中,我將應用.net的反射功用,構建一個自動完成初始化文件的保管/讀寫功用的類。在這個類中,只需順序作者在類外部按順序選項的稱號定義好類的外部成員變量(由於這個步驟依然需求順序員停止類內的手工編碼,所以稱這個類為半自動初始化類),這個類就自動將順序選項從初始化文件中保管/讀取的任務,順序員不用再停止繁瑣的讀寫文件局部的編碼。而且,這個類的構建還可以有一個益處:由於使用順序的選項都以成員變量的方式保管在類的外部,順序員可以應用VS提供的自動列出變量成員的功用查詢初始化文件的選項。例如這樣寫 string myAPPname= tobjAPPOption.General.APPName。據我所知,記住少量的順序選項確實切字符也不是什麼好玩的事哦8-)

三、順序完成先決條件剖析

1、初始化文件內容的需求

我們首先剖析察看一個規范的windows初始化文件win.ini內容:

[windows]
load=
run=
NullPort=None
device=HP LaserJet 6L PCL,PCL5EMS3,\E5A18B631240425HPLaserJ 
[Desktop]
Wallpaper=(無)
TileWallpaper=1
WallpaperStyle=0

該初始化文件的內容用方括號括住的局部我們稱為初始化文件的節,每一節下都組織了一系列與節有相應功用的順序選項。如desktop節下就含有桌面牆紙(Wallpaper)/桌面牆紙鋪設(WallpaperStyle)的設置。在初始化文件中順序的選項大都可以用字符串/數字這些復雜的數據類型停止保管。

依據這一需求,思索到目前在.net中運用xml文件十分方便,而且運用xml格式除可完成慣例windows初始化文件的功用外,還可以多出樹形構造組織的優勢,所以本文設計的初始化文件確定采用xml文件格式。並作以下格式的XML文件的元素定義:

'Net對象以XML元素保管運用的格式定義
'Net對象的定義
'<Class ObjectName=對象稱號 ObjectType(數據類型)=數據類型 > 數據內容 </數據類型>
'數組的定義 目前本類中完成的數組只支持string的一維數組
'<Array ObjectName=對象稱號 ObjectType=數據類型 Length=數組大小> 元素定義</Array>
'假如數組數組為nothing則格式如下
'<Array ObjectName=對象稱號 ObjectType=數據類型 Length=0>nothing</Array>
'復雜對象的定義'int32、String等
'<SimpleObject ObjectName=對象稱號 ObjectType(數據類型)=數據類型 > 數據內容 </數據類型>
'當SimpleObject代表數組內的元素時,objectname代表數組的維數
'ObjectName 、ObjectType、 Lenght 屬性的運用舉例如下
'例如Redim mai32Test(7) As String
'ObjectName取值為mai32Test,ObjectType取值為string[],Length 值為8

2、在.net中有一種稱之為反射的功用,可以枚舉特定類型對象所包括的成員變量的類型及貯存值,這個功用常常被一些普通順序員疏忽,以為用處並不大。但在本文中,這一功用將成為構建半自動化初始化對象的中心,我們正需求這種功用將寫在初始化類中的變量類型和值自意向初始化文件保管或讀取。

四、順序完成中心代碼正文

1、我將這個半自動初始化文件類命名為clsAPPOption,類內構造及包括進程的功用闡明如下:

兩個區域#Region "使用順序運用的選項構造定義"、#Region "使用順序選項的變量聲明"中的內容是按初始化選項級組織的類及類的實例,每一個類表示順序選項的一個初始化節,必需由最終運用者依據實踐選項需求自行手工補充。

fnGetAppDirectory:獲得使用順序的運轉目錄

sbInitialDefaultAPPOption:設置順序選項的默許初始值(這個進程中的代碼需依據實踐需求手工修正)

fnSaveAppOption:將類內的順序選項保管到一個指定的文件中. (這個進程中的局部代碼需依據實踐需求手工修正)

fnLoadAppOption:在指定的文件中讀取使用順序的選項信息並保管到以後類中(這個進程中的局部代碼需依據實踐需求手工修正)

fnXMLElementToSimpleObject:將一個XMLElement轉為它代表的復雜對象,所謂復雜對象就是諸如int32int16之類的根本net對象

fnXMLElementToClassObject:將一個XMLElement轉換為它代表的類對象

fnXMLElementToArray:將一個XMLElement轉為它代表的數組

fnArrayToXML:將一個數組放入XML文件中,目前只支持一維數組:例如dim aString(10) as string

fnClassObjectToXML:將一個類對象轉換為xml元素的表示方式

fnSimpleObjectToXML:將一個復雜對象改為XML元素表示

注:其中fnXMLElementToXXXX和fnXXXXToXML功用絕對應,互為反函數。

2、順序的完成是十分復雜的,fnClassObjectToXML對指定的類停止反射操作,

運用類的類型的GetFields辦法枚舉類內的成員變量信息,然後依據成員變量的類型調用fnSimpleObjectToXML或fnArrayToXML,在函數完畢的時分,將要轉換的類以一個XMLElement對象的方式前往。

tobjClassObjectType = ni_objClassObject.GetType '獲得類的類型,以利於反射調用

….其它代碼

REM 以構造內的一切值停止反射取值, 並存入xml對象中

For Each tobjFieldInfo In tobjClassObjectType.GetFields
If tobjFieldInfo.FieldType.IsArray = False Then '只是一個復雜類型,直接獲得值
tobjXMLElement = fnSimpleObjectToXML(tobjFieldInfo.GetValue(ni_objClassObject), _
ni_objXMLDocument, _
tobjFieldInfo.Name)
tobjXMLClassObjectElement.AppendChild(tobjXMLElement)
Else
REM 假如是一個數組類型,則停止數組辦法的調用以獲得值,
'目前只支持一維數組元素
tobjXMLElement = fnArrayToXML(tobjFieldInfo.GetValue(ni_objClassObject),

ni_objXMLDocument, tobjFieldInfo.Name, tobjFieldInfo.FieldType.FullName)
'將數組對象放入構造的xml對象中
tobjXMLClassObjectElement.AppendChild(tobjXMLElement)
End If

fnSimpleObjectToXML的完成也很復雜,依據前文確立的復雜對象的定義,fnSimpleObjectToXML進程所要生成的xml對象的幾個要素可以這樣獲取:ObjectName在f nClassObjectToXML作反射後曾經獲取,並以參數傳遞的方式在調用fnSimpleObjectToXML時提供了。 ObjectType數據類型則可以應用ni_objSimpleObject.GetType.FullName辦法獲得, ni_objSimpleObject就是在函數調用時傳入的復雜對象的值。

從XML轉為net對象的進程根本都沒有什麼技術難度。我只是依據xml中包括的ObjectType信息復雜取得復雜對象的類型,然後直接調用net強迫轉換類的功用將XML文件中指定的對象貯存的數值重新恢復為原來的net對象。代碼如下:

'依據XMLelement構造元素中指定的對象類型,樹立對象
tobjType = Type.GetType(tobjXmlSimpleObjectElement.GetAttribute("ObjectType"))
tobjReturnSimpleObject =

Convert.ChangeType(tobjXmlSimpleObjectElement.InnerText, tobjType, Nothing)

關於Xml轉為數組用數組、轉為類對象的辦法可以參閱本文所附源代碼。

3、初始化文件類實例的調用:

類定義完成當前,可以在順序的全局范圍定義初始化類的實例。在模塊內定義就可以了:

Public gobjAppOption As New clsAPPOption

可以在順序啟動的時分讀初始化文件信息到類中,我是放在主窗體的load事情中的。

'讀取順序的選項
gobjAppOption.fnLoadAppOption()

可以在順序的恣意中央保管以後半自動初始化類的值到xml文件中,

我在主窗體的closed事情中參加保管代碼:

gobjAppOption.fnSaveAppOption() '保管使用順序的選項

順序的恣意中央你都可以調用半自動初始化文件類的實例來讀取/保管順序選項的以後值:

'可以很好天時用VS提供的自動列出成員的功用列出順序選項
'讀取選項的示例代碼
MessageBox.Show(gobjAppOption.mobjAPPGeneralOption.astrShowFileFilter(0))
'保管選項的示例代碼
'gobjAppOption.mobjAPPGeneralOption.astrHideFileFilter(0) = "*.zip"

雖然這個半自動化初始化文件類還是需求手工添加大批代碼(在源代碼明白正文要手工添加的局部),但還是那句老話,假如一切事情電腦都會做的時分,離順序員下崗的日子就不遠了。

在編寫fnArrayToXML進程時呈現了一點小問題,由於調用方不能夠要求數組的元素逐一傳入,所以對數組的元素個數以及元素的值無法在函數中以對象反射的方式直接獲取。僥幸的是,在Net反射操作中,可以應用Invoke辦法來調用原始對象內的函數或屬性進程,而數組的共享辦法GetLength、GetValue功用適好是取數組元素個數及指定下標的元素值,所以問題立即迎刃而解。

'應用反射調用數組的getLenght辦法獲得數組的大小,這裡僅支持一維數組,但關於初始化文件已足夠用了
tobjXMLAttribute = ni_objXMLDocument.CreateAttribute("ArrayLength")
tobjMethodInfo = tobjArrayType.GetMethod("GetLength")
ReDim taobjParameter(0)
taobjParameter(0) = 0
ti32Tempa = tobjMethodInfo.Invoke(ni_objArray, taobjParameter)
tobjXMLAttribute.Value = ti32Tempa
tobjXMLElement.SetAttributeNode(tobjXMLAttribute)
tobjXMLAttribute = Nothing
'參加數組的內的元素
For ti32LoopA = 0 To ti32Tempa - 1
'應用反射獲得數組的GetValue辦法獲得實踐元素的值 
ReDim taobjParameterType(0)
taobjParameterType(0) = GetType(Integer)
tobjMethodInfo = tobjArrayType.GetMethod("GetValue", taobjParameterType)
ReDim taobjParameter(0)
taobjParameter(0) = ti32LoopA
tobjTempa = tobjMethodInfo.Invoke(ni_objArray, taobjParameter)
' 將數組元素放入對xml對象中
tobjXMLElementA = fnSimpleObjectToXML(tobjTempa, ni_objXMLDocument, ti32LoopA)
tobjXMLElement.AppendChild(tobjXMLElementA)
Next ti32LoopA

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