用重载操作符实现用户数据类型的转换
本文所提的类型转换是指两个类型之间没有继承关系,但其本意上又是很大的相似关系的,再某些场景下需要转换,因为不是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;
举一个我们开发中的场景,工作项的实体类有两个版本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;