c#扩展方法奇思妙用高级篇三:Enumerable.Cast<T>应用
2010-09-30 20:50:58 来源:WEB开发网用了Cast<T>,我们的代码很精简。
Cast<T>甚至还可以用在所有控件的基类Control上,它的Controls属性也是非泛型的!
1 //Control
2 var v6 = control.Controls.Cast<Control>();
看来Cast<T>好像是为 Control 准备,Control 类和Control 的派生类多处使用了非泛型。
可现在都用vs2008(甚至vs2010)了,那为什么WinForm的窗体控件还用非泛型,太落后了吧!!!
确实如此,WinForm对泛型控件(Control)的支持上存在很大问题。
虽然可以定义泛型控件,也可以使用,可以运行。但会有很多麻烦的,比如窗体设计器没法显示...
那只好使用非泛型的了,好在我们有Cast<T>!
再来看看Cast<T>对继承的支持,我们定义两个类A和B,B继承自A,如下:
1 public class A { }
2 public class B : A { }
来试试如下类型转换操作:
1 //子类集合
2 B[] bb = new B[] { new B(), new B(), new B(), new B() };
3 //转换成父类
4 A[] aa = bb.Cast<A>().ToArray();
5 //再转回子类
6 B[] bb2 = aa.Cast<B>().ToArray();
以上三个操作都可编译并运行通过,修改下再试:
1 A[] aa = new A[] { new A(), new A(), new B() };
2 B[] bb3 = aa2.Cast<B>().ToArray();
这次不行了,将父类cast为子类可不是随意的:
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换
更多精彩
赞助商链接