使用dynamic的好處在於,可以不去關心對象是來源於COM, IronPython, Html DOM或者反射,只要知 道有什麼方法可以調用就可以了,剩下的工作可以留給runtime。下面是調用IronPython類的例子:
ScriptRuntime py = Python.CreateRuntime();
dynamic helloworld = py.UseFile("helloworld.py");
Console.WriteLine("helloworld.py loaded!");
dynamic也可以用在變量的傳遞中,runtime會自動選擇一個最匹配的overload方法。
這裡有一個demo:把一段Javascript代碼拷到C#文件中,將var改成dynamic,function改成void,再 改一下構造函數的調用方式(new type()改為win.New.type()),去掉Javascript中的win.前綴(因為這 已經是C#的方法了),就可以直接運行了。
dynamic的實現是基於IDynamicObject接口和DynamicObject抽象類。而動態方法、屬性的調用都被轉 為了GetMember、Invoke等方法的調用。
public abstract class DynamicObject : IDynamicObject
{
public virtual object GetMember(GetMemberBinder info);
public virtual object SetMember(SetMemberBinder info, object value);
public virtual object DeleteMember(DeleteMemberBinder info); public virtual object UnaryOperation(UnaryOperationBinder info);
public virtual object BinaryOperation(BinaryOperationBinder info, object arg);
public virtual object Convert(ConvertBinder info); public virtual object Invoke(InvokeBinder info, object[] args);
public virtual object InvokeMember(InvokeMemberBinder info, object[] args);
public virtual object CreateInstance(CreateInstanceBinder info, object[] args); public virtual object GetIndex(GetIndexBinder info, object[] indices);
public virtual object SetIndex(SetIndexBinder info, object[] indices, object value);
public virtual object DeleteIndex(DeleteIndexBinder info, object[] indices); public MetaObject IDynamicObject.GetMetaObject();
}
Named and optional parameters
這似乎不是什麼很難實現或很新穎的特性,只要編譯器的支持就可以(VB很早就支持了)。估計加入 的原因是群眾的呼聲太高了。
帶有可選參數方法的聲明:
public StreamReader OpenTextFile(
string path,
Encoding encoding = null,
bool detectEncoding = true,
int bufferSize = 1024);
命名參數必須在最後使用:
OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096);
順序不限:
OpenTextFile(bufferSize: 4096, path: "foo.txt", detectEncoding: false);
Improved COM InterOperability