專案中很多地方採用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...