dynamic dyn = "Fode";
Object obj = "Fode";
dyn = dyn + 3;
obj = obj + 3; //这句代码编译器会报错
dynamic是Framework 4.0的新特性。dynamic的出现让C#具有了若语言的特性。编译器在编译时候不再对该类型进行检查,编译器默认dynamic对象支持开发者想要的任何特征。比如,即使你对 GetStudent()方法返回的对象一无所知,也可以像以下执行代码的调用,编译器不会报错:
static void Main(string[] args)
{
dynamic dyn = GetStudent();
//正确的操作
Console.WriteLine(dyn.Age);
Console.WriteLine(dyn.Name);
dyn.PrintName();
//错误的操作
//Console.WriteLine(dyn.Birthday); //该对象没有包含该属性
//dyn.PrintAge(); //这行代码会报错误,访问级别不够
Console.ReadKey();
}
static Student GetStudent()
{
Student student = new Student();
student.Age = 21;
student.Name = "Fode";
return student;
}
class Student
{
public String Name { get; set; }
public Int32 Age { get; set; }
public void PrintName()
{
Console.WriteLine(this.Name);
}
private void PrintAge()
{
Console.WriteLine(this.Age);
}
}
如果运行时dyn对象不包含指定的特性(属性、字段、方法等),运行时会抛出一个运行时的错误 RuntimeBinderException。
注意:有人可能会将var关键字与dynamic进行比较。实际上,var和dynamic完全是两回事,两个不同的概念。var实际上是编译期间抛给我门的“语法糖”,一旦被编译,编译器会自动匹配var变量的实际类型,并用实际类型来替换给变量的声明,这看上去就好像我们在编码的时候用实际类型进行声明一样,优点也显而易见,当【赋值方】类型发生变化时,【实现方】无需改变其类型,因为var会自动去适配。而dynamic被编译后,实际上是一个Object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。这从VS这个IDE就能看出,在编辑窗口中,var支持【智能感知】,因为vs能推断出var类型的实际类型;而dynamic声明的变量却不支持【智能感知】,因为对其运行期的类型一无所知。对dynamic变量使用【智能感知】会提示"此操作将在运行时解析"。
BB了这么久,重点来了,利用好了动态类型dynamic的这个特性,可以简化C#中的反射语法,更高深的优化将在以后的博客推出。在dynamic出现之前,我们先用基础反射获取一个类中的方法,并执行它:










