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