惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
B
Blog
罗磊的独立博客
GbyAI
GbyAI
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
宝玉的分享
宝玉的分享
The GitHub Blog
The GitHub Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
MyScale Blog
MyScale Blog
Google DeepMind News
Google DeepMind News
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏

博客园 - 栖息的熊

Mark一些关于线程同步的信息 【转载】安卓巴士Android开发神贴整理 关于Join 异常诡异的mysql连接异常:Fatal error encountered during command execution. 误人子弟的面试题答案 .Net中的安全机制 用定制特性规范构件调用 override和new关键词的差别 你必须知道的值传递和引用传递 windows用户配置文件的复制 求职:本人从事3年工作流引擎开发,熟悉XPDL,.net3.5中WF,Biztalk,开源工作流引擎OBE,期望工作地点上海 对Activity副本的再理解 Windows Workflow Foundation中实现人工活动的demo,按照XPDL规范的实现 WF消息队列的使用 查数据库死锁的实际例子 喜欢使用VMware的.net程序员要注意呀(Visual Studio启动不了的问题) 编译器错误信息: CS1595: 已在多处定义“ ”;一种可能出现的情况 BPM业务场景分析(1)——内部交易合并开票 高级工作流模式深入业务场景分析(1)——多路合并
用重载操作符实现用户数据类型的转换
栖息的熊 · 2008-10-04 · via 博客园 - 栖息的熊

本文所提的类型转换是指两个类型之间没有继承关系,但其本意上又是很大的相似关系的,再某些场景下需要转换,因为不是C#的预置类型,所以语言本身不能提供这样的转化,需要我们自己实现。
举一个我们开发中的场景,工作项的实体类有两个版本BasicWorkItem和GSPWorkItem,两个在不同的程序集中,部署位置也不同,BasicWorkItem的程序集可以在服务器和客户端都部署,而GSPWorkItem的程序集只能在服务器上部署。BasicWorkItem是GSPWorkItem的简化版本,只包含成员字段,GSPWorkItem中包含的成员函数可以做很多服务器端的操作。
在工作流引擎的运行时都是使用的GSPWorkItem,但查询工作项的操作需要将工作项返回到客户端,因此才诞生了BasicWorkItem,在过webService的时候将GSPWorkItem转换为BasicWorkItem。
有人说可以将BasicWorkItem作为GSPWorkItem的基类呀,这样就可以隐式转换了呀。但是BasicWorkItem引用指向的对象其实是GSPWorkItem类型的,在WebServiceClient端反序列化对象时,就是因为缺少GSPWorkItem的程序集而出错。
这里只能新建BasicWorkItem对象,将其一个个字段的赋值。现在代码里的写法是在过webService的一层上加一个Convert方法,但这样代码就很零散了,不好维护。但如果我们在BasicWorkItem类中重载显示类型转换的操作符,这个过程就会很优雅,而且代码集中,易于管理。
这里就写个示例。
BasicWorkItem.cs

//ect.
public static explicit operator BasicWorkItem(GspWorkItem gspWorkItem)
{
BasicWorkItem result = new BasicWorkItem();
result.WorkItemId = gspWorkItem.WorkItemId;
return result;
}
//ect.

这样在调用时就可以像预置类型一样转换了。
BasicWorkItem basicWorkItem = (BasicWorkItem)gspWorkItem;