原来还有dynamic这东西。
或许之前看过.net4.0的新特性,或许哪个技术文章或者源代码中使用了dynamic类型,不过都没特别注意过它,平时也基本不会和它打交道。今天遇到了个问题,百思不得姐。
先引入dynamic类型的定义:
在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作。
不同于var,var一般在定义局部变量的时候使用,往往你都不用考虑它是什么类型的变量,你只管使用她就行了。var这个语法糖比较甜,平时用的也比较多。与dynamic类型相反,它是个编译时就解析这个行为。
前台定义了DataGrid,binding了一个ItemsSource,但是后台的源不止一个,我想在不同的条件判断下显示不同的源。(MVVM下的Demo)
xaml:
<DataGrid ItemsSource = {Binding DataShowItemsSource}/>
要binding的两个源:
//Source A public class Student { public int Age { get; set; } public string Name { get; set; } } //Source B public class Course { public string Name { get; set; } public string CourseName { get; set; } }
保存这两个源并且具有通知属性的集合,毫无疑问binding DataGrid的ItemsSource的属性也是ObserverableCollection类型的:
ObserverableCollection<Student> studentList;
ObserverableCollection<Course> courseList;
现在的问题是该ItemsSource到底应该存什么样的类型,Student?or Course?如果我想做类似的事情,通过条件判断我就能binding不同的源:
if(A) { ShowDataItemsSource = studentList; } if(B) { ShowDataItemsSource = courceList; }
可是ShowDataItemSource有可能是两种泛型:ObserverableCollection<Student> 或者ObserverableCollection<Course>,但是我们只有在if判断之后才能明确知道ShowDataItemsSource的具体类型。
有了dynamic,只要将DataShowItemsSource类型定义为dynamic就可以在运行时判断它的类型了。
想想如果回到4.0以前,我是不是要考虑建两个view,或者建两个DataGird,或者干脆把这两个数据源对象写在一起?