區別
- var是編譯器的語法糖,在編譯期檢查。
- dynamic是運行時解析。編譯期不做任何檢查。
示例
未知函數F(),有返回值。dynamic格式的返回值可以任意操作,且能通過編譯。但var只是語法糖,數據結構仍與F函數的返回值一致,無法做到任意操作。
dynamic a = F();
a.good = 10;
var b = F();
b.good = 10; // 該行編譯檢查報錯
dynamic的反射應用
class Test
{
public int F1() => 1;
private int F2(int a, int b) => 2;
}
- 不使用dynamic的反射實現
var t = typeof(Test);
Test obj = new Test();
// 或 Test obj = Activator.CreateInstance(t);
// 反射共有方法,無參數
var m1 = t.GetMethod("F1");
// 反射私有方法,帶參數
var m2 = t.GetMethod("F2", BindingFlags.NonPublic | BindingFlags.Instance);
var ret1 = (int)m1.Invoke(obj, null);
var ret2 = (int)m2.Invoke(obj, new object[] {1,2});
- 使用dynamic
dynamic obj = new Test();
var ret = obj.F1();