dynamic與xml的相互轉換

2021-09-06 02:11:27 字數 3560 閱讀 5841

專案中很多地方採用dynamic新特性進行開發,因此本人參看了很多關於dynamic的資料。在新的一年開始,記錄下自己的學習經驗。

dynamic關鍵字用於宣告乙個動態物件,然後通過該動態物件去呼叫方法或讀寫屬性。

(一)測試alexandra rusina

提供的參考資料 1

static

void

main(

string

args)2

1private

static

void

rundynamicxmlnode(

bool

state)212

contact.address.street ="

123 main st";

13}14catch

(runtimebinderexception ex)

1518

console.writeline(

"------run end--------");

19}執行後顯示結果如下:

設定斷點進行單步除錯,發現trygetmember方法中:如果當前元素xelement下沒有相應的xname的子元素,那麼result =

null;

正常執行contact.address =

newdynamicxmlnode();建立了乙個新的dynamic物件。反之,contact.address =null;將導致runtimebinderexception異常。

1public

override

bool

trygetmember(getmemberbinder binder, 

outobject

result)29

else

1014}

(二)對以上的類進行相應的修改

因此本人將之進行相應的改進,result =

newdynamicxelement(binder.name);  當無法找到匹配的xelement時,返回乙個新的dynamicxelement物件。改動如下:

1public

override

bool

trygetmember(

2getmemberbinder binder, 

outobject

result)39

else10 

13return

true;14

} 1private

static

void

rundynamicxelement()2

因此,contact.address.street =

"123 main st

";這句將會建立乙個新的dynamicxelement物件,引數為"address",此處將不再丟擲runtimebinderexception異常。

(三)定義乙個dynamichelper類,實現dynamic物件與xml之間的互換操作

自定義乙個dynamichelper類,主要是實現dynamic物件與xml之間的互換操作。

toxml(dynamic dynamicobject)將傳入的dynamicobject轉換為xml。

toobject(string

xml, dynamic dynamicresult) 將傳入的string,先轉換成xelement元素,然後再構建乙個dynamicxelement物件,返回結果。

toobject(string

xml)直接將xml轉換為dynamicxelement物件。 1

public

class

dynamichelper28

9public

static

dynamic toobject(

string

xml, dynamic dynamicresult) 

1015

16public

static

dynamic toobject(

string

xml)

1722}

為了實現toxml()方法,修改dynamicxelement類,將私有變數node設定為屬性xcontent(並且設定set 方法為私有的)。這裡,主要是為了獲取xelement的所有內容而改進的。設定後的dynamicxelement類如下:

1public

class

dynamicxelement : dynamicobject27

8public

dynamicxelement()911

12public

dynamicxelement(string name)

1316

17public

xelement xcontent

1822

23public

override

bool

trysetmember(

24setmemberbinder binder, 

object

value)

2537

return

true;38

}3940public

override

bool

trygetmember(

41getmemberbinder binder, 

outobject

result)

4248

else49 

52return

true;53

}5455public

override

bool

tryconvert(

56convertbinder binder, 

outobject

result)

5763

else

6468}69

}

其他的都設定好了以後,rundynamichelper()將驗證以上的方法,對dynamichelper中所有的方法進行相應的測試。

1private

static

void

rundynamichelper()2

顯示結果如下:

(四)注意:對於我們新增的資源檔案,需要對自動生成的.cs進行相應的修改。

資源檔案自動新增之後,類以及相關的屬性訪問修飾符將預設設定為internal(程式集可見),因此我們必須對訪問修飾符進行相應的修改,設定為public。

1public

class

resources         

5public

static

string

importsample 9}

Delta與XML相互轉換

大家都知道tclientdataset的delta屬性儲存資料集的變化,但是delta是olevariant型別的屬性,這樣如果用delphi寫webservice,就有需要把它轉成xml,特別是其他語言也要用這個webservice的時候,因為如果delta能和xml相互轉換,delta包的結構就...

XML與DataSet的相互轉換

一 xml 與 dataset 的關係如下圖所示 二 dataset 物件的常用方法如下 a.使用readxml 方法 從檔案或流中載入xml 資料,填充dataset 物件。dataset 物件.readxml 檔案路徑字串 stream 物件,xmlreadmode 列舉值 可以省略 b.使用w...

DataTable與Xml的相互轉化

using system using system.collections.generic using system.linq using system.text using system.data namespace test2 new person datatable dt new datata...