TIOBE 排行榜前十名動態語言佔六席 (PHP、Python、Perl、JavaScript、Java、C#)。「未來屬於動態語言」從預言變現實。C# 4.0 以 動態程式設計 為核心主題,引入 `dynamic` 型別,讓物件結構與行為在執行期才被解析,極大提升與動態世界 (COM、IronPython、HTML DOM、反射) 的互操作彈性。
dynamic drink = GetDrink(userChoice); // 執行期決定是 Coffee 或 Juice
Console.WriteLine(drink.GetName()); // 編譯不檢查方法存在性
編譯器發出 動態呼叫站,DLR 快取繫結規則,二次呼叫效能接近靜態。
專案:C# Future Samples (MSDN) → `SilverlightSolution`
public partial class Page : UserControl {
dynamic doc = HtmlPage.Document.AsDynamic(); // 動態文件
dynamic win = HtmlPage.Window.AsDynamic(); // 動態視窗
// ...
}
void btnSearch_Click(object sender, RoutedEventArgs e) {
doc.Title = "Pictures of " + txtTag.Text; // 直接指派,無需反射
lstPictures.ItemsSource = Source.LoadItems();
}
在 `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>
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);
}
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); // 選項切換動態加標記
}
動態程式設計讓 C# 以靜態語言身分,獲得動態語言級的表達力與互操作能力。Silverlight + HTML DOM + Virtual Earth 實戰,完美展示 `dynamic` 如何消除反射樣板碼,讓跨語言、跨邊界程式設計回歸本質——寫直覺的碼,其餘交給 DLR。