C#引入了一種新的靜態類型”dynamic”,當你擁有了一個dynamic類型的對象後,你“對它做的事情”只會在運行時進行解析。設想我們擁有這樣兩個類,分別表示兩種飲料:
public class Coffee
{public string GetName()
{
return "You selected Maxwell coffee.";
}
}
public class Juice
{
public string GetName()
{
return "You selected orange juice.";
}
}
現在,我們就可以用dynamic類型來表示這兩種飲料。我們寫一個函數GetDrink(),根據用戶不同的選擇返回不同的對象。
static private Object GetDrink(int i)
{
if (i == 1)
{
return new Juice();
}
else
// default
{
return new Coffee();
}
}
static void Main(string[] args)
{Console.WriteLine("Please Select Your Drink: 1 -- Juice; 2 -- Coffee");
int nDrinkType = Console.Read();
dynamic drink = GetDrink( nDrinkType );
Console.WriteLine( drink.GetName() );
}
C#編譯器允許你通過dynamic對象調用任何方法,即使這個方法根本不存在,編譯器也不會在編譯的時候報編譯錯誤。只有在運行的時候,它才會檢查這個對象的實際類型,並檢查在它上面GetName()是什麼意思。動態類型將使得C#可以以更加統一而便利的形式表示下列對象:
◆ 來自動態編程語言——如Python或Ruby——的對象
◆ 通過IDispatch訪問的COM對象
◆ 通過反射訪問的一般.NET類型
◆ 結構發生過變化的對象——如HTML DOM對象
當我們得到一個動態類型的對象時,不管它是來自COM還是IronPython、HTML DOM還是反射,只需要對其進行操作即可,動態語言運行時(DLR)會幫我們指出針對特定的對象以及這些操作的具體意義。這將給我們的開發帶來極大的靈活性,並且能夠極大程度上地精簡我們的代碼。