Tip15 使用dynamic來簡化反射實現
dynamic是Framework 4.0的新特性。dynamic的出現讓C#具有了弱語言的特性,編譯器默認dynamic對象支持開發者想要的任何特性。
var和dynamic完全是兩個概念。var實際上是“語法糖”,編譯器會自動匹配var變量的實際類型,並用實際類型來替換該變量的聲明。而dynamic被編譯後實際是一個object類型,不過編譯器不會對dynamic進行任何的類型檢查,在運行期才進行類型檢查。
利用dynamic可以簡化C#中的反射語法,例如:
public class DynamicSample
{
public string Name { get; set; }
public int Add(int a,int b)
{
return a + b;
}
}
調用測試5000000次,比較dynamic和傳統的反射效率:
int times = 5000000;
DynamicSample reflectSample = new DynamicSample();
var addMethod = typeof(DynamicSample).GetMethod("Add");
Stopwatch watch1 = Stopwatch.StartNew();
for (int i = 0; i < times; i++)
{
addMethod.Invoke(reflectSample, new object[] { 1, 2 });
}
Console.WriteLine(string.Format("反射耗時:{0} 毫秒", watch1.ElapsedMilliseconds));
Stopwatch watch2 = Stopwatch.StartNew();
dynamic dynamicSample = new DynamicSample();
for (int i = 0; i < times; i++)
{
dynamicSample.Add(1, 2);
}
Console.WriteLine(string.Format("dynamic耗時:{0} 毫秒", watch2.ElapsedMilliseconds));
結果如下:
反射耗時:2264 毫秒
dynamic耗時:226 毫秒