一.object,var,dynamic的区别
static void Main() { //var是C# 3中引入的,其实它仅仅只是一个语法糖. var本身并不是一种类型, 其它两者object和dynamic是类型。 //var声明的变量在赋值的那一刻,就已经决定了它是什么类型。 //object之所以能够被赋值为任意类型的原因,其实都知道,因为所有的类型都派生自object. 所以它可以赋值为任何类型: //dynamic它的特点是申明为dynamic类型的变量,不是在编译时候确定实际类型的, 而是在运行时。 var a = 1; object b = 1; dynamic c = "1"; //报错,类型已确认为int //a = new string[] { "1" }; b = new string[] { "1" }; //代码是能够通过编译的,但是会在运行时报错: c++; }
二.dynamic的用法
static void Main() { //1 直接使用该类型,可以非常方便的插入属性, 方法 dynamic person = new System.Dynamic.ExpandoObject(); person.Name = "cary"; person.Age = 25; person.ShowDescription = new Func<string>(() => person.Name + person.Age); Console.WriteLine(person.Name + person.Age + person.ShowDescription()); Console.ReadLine(); }
static void Main() { //2 枚举所有成员 dynamic person = new System.Dynamic.ExpandoObject(); person.Name = "cary"; person.Age = 25; person.ShowDescription = new Func<string>(() => person.Name + person.Age); foreach (var property in (IDictionary<String, Object>)person) { Console.WriteLine(property.Key + ": " + property.Value); } Console.ReadLine(); }
class Program { static void Main() { //3 简化反射 //常用的处理反射的例子: GetCalculator _getcalculator = new GetCalculator(); object calc = _getcalculator; Type calcType = calc.GetType(); object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, _getcalculator, new object[] { 10, 20 }); int sum = Convert.ToInt32(res); //使用dynamic之后: dynamic calc1 = _getcalculator; int sum1 = calc1.Add(10, 20); Console.WriteLine("sum的值为{0},sum1的值为{1}", sum, sum1); Console.ReadLine(); } } class GetCalculator { public int Add(int a, int b) { return a + b; } }
三.使用dynamic的注意事项
有了dynamic,.net就以及有了动态类型的优势,但是由于对于dynamic类型的所有操作,都是在运行时确定的,所有错误无法在编译时候出现,使用的时候,就需要非常小心。
因为dynamic是类型,所以如果函数接受的是确定类型的参数,是不能传入dynamic类型的,这样会有编译错误。比如:
public int Add(int a, int b){ return a + b; } dynamic test1 = 1; dynamic test2 = 2; Add(test1, test2);