并以参数传递的方式在调用fnSimpleObjectToXML时提供了。 ObjectType数据类型则可以利用ni_objSimpleObject.GetType.FullName方法取得, ni_objSimpleObject就是在函数调用时传入的简单对象的值。
在编写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
从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" |
虽然这个半自动化初始化文件类还是需要手工添加少量代码(在源代码明确注释要手工添加的部分),但还是那句老话,如果一切事情电脑都会做的时候,离程序员下岗的日子就不远了。