首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 4.0 動態型別與動態程式設計:從理論到 Silverlight DOM 互操作實戰

     編輯:關於C#

動態語言浪潮下的 C# 回應

TIOBE 排行榜前十名動態語言佔六席 (PHP、Python、Perl、JavaScript、Java、C#)。「未來屬於動態語言」從預言變現實。C# 4.0 以 動態程式設計 為核心主題,引入 `dynamic` 型別,讓物件結構與行為在執行期才被解析,極大提升與動態世界 (COM、IronPython、HTML DOM、反射) 的互操作彈性。

核心機制:dynamic + DLR


dynamic drink = GetDrink(userChoice); // 執行期決定是 Coffee 或 Juice
Console.WriteLine(drink.GetName());   // 編譯不檢查方法存在性

編譯器發出 動態呼叫站,DLR 快取繫結規則,二次呼叫效能接近靜態。

動態物件四大來源

  1. 動態語言物件 (IronPython、IronRuby)
  2. COM 物件 (透過 `IDispatch`)
  3. .NET 物件 (透過反射包裝)
  4. 結構流動物件 (HTML DOM、XML、JSON)

實戰:Silverlight 4 操作 HTML DOM 與 Virtual Earth 地圖

專案:C# Future Samples (MSDN) → `SilverlightSolution`

環境準備

  1. 安裝 Silverlight 2 Runtime + SDK
  2. 以管理員身分啟動 VS 2010 (Silverlight 相容性需求)
  3. 開啟專案,確認空白頁面可跑

步驟 1:取得動態 DOM 參考


public partial class Page : UserControl {
    dynamic doc = HtmlPage.Document.AsDynamic(); // 動態文件
    dynamic win = HtmlPage.Window.AsDynamic();   // 動態視窗
    // ...
}

步驟 2:動態修改頁面標題


void btnSearch_Click(object sender, RoutedEventArgs e) {
    doc.Title = "Pictures of " + txtTag.Text; // 直接指派,無需反射
    lstPictures.ItemsSource = Source.LoadItems();
}

步驟 3:引用 Virtual Earth JavaScript 控制項

在 `StartPage.htm` 注入:


<script src="https://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"></script>
<div id="myMap" style="position:absolute; top:40px; left:200px; width:550px; height:400px;"></div>

步驟 4:C# 直接控制 JS 地圖物件


dynamic map = null;

void GetMap() {
    map = win.New.VEMap("myMap"); // 對應 JS: new VEMap("myMap")
    map.LoadMap();
}

void AddPin(Item item) {
    dynamic loc = win.New.VELatLong(item.Latitude, item.Longitude);
    var pin = map.AddPushpin(loc);
    pin.SetTitle(item.Title);
    pin.SetDescription(item.Description);
    map.SetCenterAndZoom(loc, 7);
}

對比:C# 3.0 反射式寫法 (痛苦)


void AddPin_Old(Item item) {
    ScriptObject loc = win.CreateInstance("VELatLong", item.Latitude, item.Longitude);
    ScriptObject pin = (ScriptObject)map.Invoke("AddPushpin", loc);
    pin.Invoke("SetTitle", item.Title);
    pin.Invoke("SetDescription", item.Description);
    map.Invoke("SetCenterAndZoom", loc, 7);
}

dynamic 版本:自然語法、IntelliSense 輔助、除錯可見、效能更優 (DLR 快取)。

整合與觸發


public void Init() => GetMap(); // 頁面載入初始化地圖

void lstPictures_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    AddPin(lstPictures.SelectedItem as Item); // 選項切換動態加標記
}

執行結果

Silverlight 初始頁面
圖 1. 初始頁面
Virtual Earth 地圖與動態標記
圖 2. 選擇圖片後動態標記地理位置

動態程式設計讓 C# 以靜態語言身分,獲得動態語言級的表達力與互操作能力。Silverlight + HTML DOM + Virtual Earth 實戰,完美展示 `dynamic` 如何消除反射樣板碼,讓跨語言、跨邊界程式設計回歸本質——寫直覺的碼,其餘交給 DLR。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved