原来还有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,或者干脆把这两个数据源对象写在一起?

 

posted @ 2012-11-16 22:42  一梦三只鸭  阅读(2151)  评论(12编辑  收藏  举报