【转】C# 动态对象(dynamic)的用法
說到正確用法,那么首先應(yīng)該指出一個(gè)錯(cuò)誤用法:
常有人會(huì)拿var這個(gè)關(guān)鍵字來和dynamic做比較。實(shí)際上,var和dynamic完全是兩個(gè)概念,根本不應(yīng)該放在一起做比較。var實(shí)際上是編譯期拋給我們的“語法糖”,一旦被編譯,編譯期會(huì)自動(dòng)匹配var 變量的實(shí)際類型,并用實(shí)際類型來替換該變量的申明,這看上去就好像我們?cè)诰幋a的時(shí)候是用實(shí)際類型進(jìn)行申明的。而dynamic被編譯后,實(shí)際是一個(gè)object類型,只不過編譯器會(huì)對(duì)dynamic類型進(jìn)行特殊處理,讓它在編譯期間不進(jìn)行任何的類型檢查,而是將類型檢查放到了運(yùn)行期。
我認(rèn)為dynamic很有價(jià)值的一點(diǎn)是:
類型轉(zhuǎn)換
Dynamic類型的實(shí)例和其他類型的實(shí)例間的轉(zhuǎn)換是很簡(jiǎn)單的,開發(fā)人員能夠很方便地在dyanmic和非dynamic行為間切換。任何實(shí)例都能隱式轉(zhuǎn)換為dynamic類型實(shí)例,見下面的例子:
dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();
?
Conversely, an implicit conversion can be dynamically applied to any expression of type dynamic.
反之亦然,類型為dynamic的任何表達(dá)式也能夠隱式轉(zhuǎn)換為其他類型。
int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;
?
dynamic可以簡(jiǎn)化反射。
首先還是聲明一下,使用場(chǎng)景:
1、如果編譯時(shí)函數(shù)名稱確定,對(duì)象類型運(yùn)行時(shí)確定,那么運(yùn)用dynamic是一個(gè)好主意。
2、如果編譯時(shí)函數(shù)名稱確定,對(duì)象類型在編譯時(shí)也確定,那就既不需要反射也不需要dynamic。
3、如果函數(shù)名稱在運(yùn)行時(shí)才能確定的話,那函數(shù)名稱就是一個(gè)字符串,必須使用反射來完成。
以前我們這樣使用反射:
public class DynamicSample { public string Name { get; set; }public int Add(int a, int b) { return a + b; } } DynamicSample dynamicSample = new DynamicSample(); //create instance為了簡(jiǎn)化演示,我沒有使用反射 var addMethod = typeof(DynamicSample).GetMethod("Add"); int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });現(xiàn)在,我們有了簡(jiǎn)化的寫法:
dynamic dynamicSample2 = new DynamicSample(); int re2 = dynamicSample2.Add(1, 2);總結(jié)
以上是生活随笔為你收集整理的【转】C# 动态对象(dynamic)的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广发弘利大集合收益怎么计算?超额需扣除业
- 下一篇: 支付宝还信用卡多久能到账