static void Main(string[] args) { // 堆代码 duidaima.com dynamic dynamicObject = new Person(); var attr1 = dynamicObject.Name; var attr2 = dynamicObject.GetAge(); Console.ReadLine(); } public class Person { public string Gender { get; set; } public string Name { get; set; } public int MakeMoney() { return 200; } }上述在编译时是不会报错的,但是在运行时,执行第二句是没问题的,因为得到的 dynamicObject 对象是有 Name ,Gender 两个属性的,但是执行第三句时就会抛出异常 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ,并提示 does not contain a definition for 'GetAge'。
3.var 类型的变量可以使代码更加简洁和易于阅读,而使用 dynamic 类型的变量则可以使代码更加灵活和动态。
Person person = new Person(); var method = typeof(Person).GetMethod("MakeMoney"); int moneys = (int)method.Invoke(person, null);那如果使用 dynamic 进行简化,则像这样:
dynamic person = new Person(); int moneys = person.MakeMoney();这样使用 dynamic 后,代码更简洁,而且也减少了一次拆箱操作。
static void Main(string[] args) { BenchmarkRunner.Run<BenchmarkTest>(); } [SimpleJob(RunStrategy.ColdStart, iterationCount: 100000)] [MemoryDiagnoser] public class BenchmarkTest { [Benchmark()] public int UseReflection() { Person person = new Person(); var method = typeof(Person).GetMethod("MakeMoney"); int moneys = (int)method.Invoke(person, null); return moneys; } [Benchmark()] public int UseDynamic() { dynamic person = new Person(); int moneys = person.MakeMoney(); return moneys; } }看一下 BenchmarkDotNet 测试结果,从报告中能看出来,使用 Dynamic 方式的方法的平均执行时间(Mean)和内存分配(AllLocated)时远小于使用反射实现的。