匿名型別 JSON的利器
剛開始學JavaScript的時候
JavaScript對物件操作的隨性, 委實讓我大吃一驚
竟然可以用這樣的語法就隨意的在後段的程式幫已經宣告好的物件增加屬性
var obj = { name : 'John', age : 14 };
//balh balh
obj.sex = 'female';
竟然還有這樣的, 讓我一開始不太能接受
尤其C#對於型別的嚴謹 很難適應過來
不過寫久了就覺得這種寫法蠻爽的(挖鼻孔)
只要不把這個自由度無限上崗, 跨界亂搞
其實這個特性在開發js程式的時候, 可以讓程式更有彈性
===============
在 C# 3.5 加入LINQ的時候
同時增加了匿名型別這種東西
宣告的方法也很酷
var obj = new { Name= "John", Age = 14 };
在之後就可以用obj.name存取他的屬性
乍看之下是跟JavaScript很像啦
不過還是有差別就是了
例如說宣告之後不能在增加屬性啊
或著只能在同一個區域使用之類的
(這塊很深啦 我也不是很了解 目前僅止於會用而已 orz)
而這個東西對於JSON有什麼幫助呢
還記得前一篇說到可以用
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
標住PageMethod
就讓這個Method在回傳值的時候, 自動將return的物件parse成JSON格式在傳給Client端
假如在搭配上匿名型別的話
我們可以自由的組合要回傳的物件格式, 屬性名稱, 物件內容
而不會受限於我們既有Class架構
像是
[System.Web.Services.WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static object FindData(int itemId)
{
Student stu = new StudentBaseDb().Get(itemId); //我既有的類別
object = new {
name = stu.Name, //換屬性名稱
age = stu.Age - 3, //讓自己年輕一點
phone = stu.Phone //其他屬性都省略, 只傳必要的值就好
};
return object
}
可以看到用匿名型別去操作既有的類別
並且有的類別落落長, 我們其實沒必要通通都傳去Client端浪費我們寶貴的頻寬
可以用匿名型別去瘦身 再傳去Client端
而Client端因為本來JavaScript就有的特性
因此接到的回傳值根本不用考慮他是什麼型別的
可以直接用 data.d.name 去操作回傳的物件屬性
這真的是讓我們寫程式更方便
不過要注意的是, Server端用匿名型別回傳物件給Client端, 因為JavaScript的特性 不需要有既定的類別去接就可以操作
但是Client端要傳匿名型別給Server端, C#必須還是要有一個既有的類別去承載, 程式才可以正常的運作
這邊可以參考我崇拜的黑暗執行緒前輩的這篇文章
http://blog.darkthread.net/post-2010-06-05-json-reflected-class-codegen.aspx
可以用比較簡單的方法為你自訂的JS匿名型別建立一個對應的C#類別
我就不野人獻曝了
附帶一提,
匿名型別結合LINQ威力倍增
不過LINQ這個領域建議還是買本書扎實的學比較實在
我也還在努力讓自己的LINQ堪用啊
阿彌陀佛
--
本文可能有理解錯誤 或不盡不實的地方
請路過的前輩不要客氣 用力打醒
這會是我們成長的主要養分