C#4.0中的dynamic關鍵字和ExpandoObject對象

來源:互聯網
上載者:User

我們做Web應用程式開發的程式員,我想大家對JavaScript的接觸一定不少,在JavaScript中我們經常用到一個功能,就是可以隨時隨地的建立一個對象,然後就可以自訂的給它定義自己需要的屬性,就如下面的簡單例子

  代碼

 < script type = " text/javascript " > 
function getObject(name) {
var obj = new Object();
// 自訂兩個屬性
obj.Name = name;
obj.Sex = " 男 " ;
return obj;
}

function onbtnClick() {
var retobj = getObject( " 吖龍 " ); // 調用自訂的屬性
alert( " 姓名: " + retobj.Name + " \n性別: " + retobj.Sex);
}
< / script>

用下面代碼調用

 < input type ="button" id ="btnTest" value ="自訂屬性" onclick ="onbtnClick();" /> 

 

單擊自訂屬性按鈕後,會像我們意料的一樣擷取到了相應的自訂屬性值。

  曾經,我為上面的方便用法瘋狂和興奮過,這幾天看到了C#4.0也提供了這種用法,更是興奮不已,擷取你已經覺得早就已經熟運於心了,請原諒我的反應遲鈍和步伐慢。今天懷著分享的心給簡單介紹一下C#4.0中的關鍵字dynamic和對象ExpendoObject對象。

  我的類型,我做主,編譯器繞道過···

  dynamic最大的特點我想莫過於在它的類型在運行時才確定,這也是它與往靜態類型關鍵字的最大區別。如果你在你的代碼操作中用到了dynamic關鍵字去定義一個變數時,那麼這個變數在編譯的時候編譯器不會對它進行類型檢查,允許它到啟動並執行時候再做解釋。在大多數情況下,dynamic 類型與object 類型的行為是一樣的。但是,不會用編譯器對包含 dynamic 類型運算式的操作進行解析或類型檢查,只是將有關該變數編譯到類型 object 的變數中以及有關它的操作資訊打包在一起,在運行時再解釋運行。像下面的代碼:

             dynamic objDynamic = objDynamic + 1;//編譯通過
            object objObject = objObject + 1;//編譯不通過

原因就是編譯器不對dynamic進行類型的檢查,這也是兩者最大的區別。 

  dynamic關鍵字可以用於很多情況,比如在聲明中,作為屬性、欄位、索引器、參數、傳回值或類型約束的類型等等,用法和其他基本類型的關鍵字很類似,更詳細可以看Dynamic(C#參考)

   為了實現一個像上面JavaScript中的功能,在C#4.0中新添加了一個ExpandoObject對象,它位於程式集:  System.Core(在 System.Core.dll 中)命名空間:  System.Dynamic 中,他的用法和我上面舉得JavaScript的用法很類似,下面偷懶一下,借用用msdn的一個例子:

 

  

  

  代碼

 static void Main( string [] args)
{
dynamic employee, manager;

employee = new ExpandoObject();//配合dynamic建立一個ExpandoObject對象     //給這個對象自訂一些屬性
employee.Name = " John Smith " ;
employee.Age = 33 ;

manager = new ExpandoObject();
manager.Name = " Allison Brown " ;
manager.Age = 42 ;
manager.TeamSize = 10 ;

WritePerson(manager);
WritePerson(employee);
}
private static void WritePerson(dynamic person)
{
Console.WriteLine( " {0} is {1} years old. " ,
person.Name, person.Age);//調用屬性 // The following statement causes an exception
// if you pass the employee object.
// Console.WriteLine("Manages {0} people", person.TeamSize);
} //輸出"John Smith is 33 years old."; //輸出"Allison Brown is 10 years old.";

 

 

和JavaScript中的用法十分類似,從今以後,在像要序列化一些資訊返回用戶端等簡單傳值的情況下,我們也可以像JavaScript一樣很方便的使用這種方法了,由於很少寫文章,加上知識淺薄,文章寫得亂成一團,希望大家原諒,這篇文章只是起到拋磚引玉的作用,更多的資訊可以查看MSDN的技術文檔ExpandoObject 類和dynamic(C# 參考)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.