区别
- 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();