将数据从类A对象转换为类B对象
本文关键字:对象 转换 数据 | 更新日期: 2023-09-27 17:49:33
我有三个不同的类:
Task
Order
Transmission
每个类有不同类型的属性。此外,还可以附加由自定义字段表示的数据(由IField数组实现,其中IField可以是文本字段或列表字段)。每个自定义字段都有一个名称,表示附加的数据属性的名称。
我需要在每个类之间转换为另一个类:
Task -> Order
Order -> Transmission
Transmission -> Task
Transmission -> Order
Order -> Task
Task -> Transmission
我创建了:
- 静态键的静态类,其中每个键代表的名称财产。
- "
DataObject
",包含一个属性名称的字典和一个对象作为其值。 每个类(Task, Order, Transmission)实现idatshare接口:
public interface IDataShare { DataObject ToDataObject(); void FromDataObject(DataObject data); }
例如,具有以下属性的任务对象:
WorkerId:5
CustomerId:7
VehicleId:null
StartDate:null
和以下自定义字段:
Subcontractor: {listId:5, Value:4} (this is list field)
delivery Note: "abc" (this is text field)
将被转换为以下字典:
{"WorkerId", 5}
{"CustomerId", 7}
{"VehicleId", null}
{"StartDate", null}
{"Subcontractor", {listId:5, Value:4}}
{"delivery Note", "abc"}
字符串键"WorkerId","CustomerId","VehicleId","StartDate"取自包含字符串常量的静态类,其中"Subcontractor"answers"deliveryNote"是用户添加的自定义字段的名称(我不知道用户可能添加哪些字段,所以我只是使用字段名称)。当我使用DataObject填充对象时,我必须验证属性的名称与键的名称相同,并且还要验证值是否正确(字符串不能插入到long中)。此外,自定义列表字段(分包商)不能只有itemId作为值,因为当我必须验证对象中自定义字段的listd与DataObject中customField的listd相同时。
我有很多关于知道值的类型的问题。我总是需要使用"X是Y"如果"X是Y"的语句。此外,在实现idatshaare接口时,我必须记住如何存储值的类型,这使得工作更加困难。
谁能帮我想想约束我可以添加到转换过程从一个对象到数据对象?谁能帮我改进这种转换对象的方法?
谢谢!
我想解释一点。我最大的问题是,有几种方法可以转换每个属性/自定义字段,因此我需要记住DataObject中值的类型。例如,在传输类中,我有车辆id属性。我想转换任务对象与自定义字段与名称"车辆id"传输。我想要的只是将Task的自定义字段VehicleId的值转换为Transmission的VehicleId属性。但是,因为它是自定义字段-正如我之前写的-有一种方法我存储基于list: {listId:5, Value:4}
的自定义字段。现在,在转换过程中(传输中的FromDataObject),如果DataObject有"VehicleId"键,我必须检查值是长(车辆id作为属性)还是IListField(车辆id作为自定义列表字段)。这些类型检查确实会造成混乱。
如果你要转换的类的数量真的像你说的那样有限,我建议你可以为你的类写强制转换操作符吗?
http://msdn.microsoft.com/en-us/library/xhbhezf4%28v=VS.100%29.aspx似乎你在转换中投入的逻辑量足以保证这样的事情。另一方面,似乎有一组基本的字段在不同的对象之间使用,而你只是把它们塞进了一个无类型的字典。如果字段在所有类型中都是通用的,您是否可以使用到强类型公共对象的转换?这也引出了一个问题:您可以使用公共基类对象吗?
如果您有修改Task、Order和Transmission定义的选项,我会再看一遍。这种场景看起来像是"代码气味"。
如果我理解正确的话,ToDataObject
基本上是一个序列化器,FromDataObject
是一个反序列化器。如果这些对象包含的数据是类型兼容的,那么将其序列化为无类型数据的行为似乎就是问题的根源。为什么要这样做,而不是保持数据的原始格式?
如果你需要使用适配器,因为对象之间有不兼容,无法解决的某些原因,我认为你可以做一个至少保持数据在其原生结构,而不是序列化所有的字符串。c#中的字典可以包含任何东西,至少你可以使用Dictionary<string,object>
。
也不清楚所有这些验证是关于什么——如果你映射相同数据类型的属性,为什么数据不兼容?例如,假设这是一个内部进程,在什么情况下(例如)一个对象中的string
试图被分配给另一个对象中的long
?似乎只有当数据在一个对象中是强类型的,而在另一个对象中不是时,才需要这样做。
您考虑过使用泛型吗?
如果Task、Order和Transmission都继承自Property之类的基类,那么您可以公开一个通用方法来获取所需的值。GetMyValue() where T: Property
我不太清楚你想达到什么目的。