Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据从类A的对象转换为类B的对象_C#_.net_Design Patterns - Fatal编程技术网

C# 将数据从类A的对象转换为类B的对象

C# 将数据从类A的对象转换为类B的对象,c#,.net,design-patterns,C#,.net,Design Patterns,我有三门不同的课: Task Order Transmission 每个类都有不同类型的属性。此外,还可以附加由自定义字段表示的数据(由IField数组实现,其中IField可以是文本字段或列表字段)。每个自定义字段都有一个名称,表示附着数据属性的名称 我需要在每个类之间转换为另一个类: Task -> Order Order -> Transmission Transmission -> Task Transmission -> Order Order -> T

我有三门不同的课:

Task
Order
Transmission
每个类都有不同类型的属性。此外,还可以附加由自定义字段表示的数据(由IField数组实现,其中IField可以是文本字段或列表字段)。每个自定义字段都有一个名称,表示附着数据属性的名称

我需要在每个类之间转换为另一个类:

Task -> Order
Order -> Transmission
Transmission -> Task
Transmission -> Order
Order -> Task
Task -> Transmission 
为此,我创建了:

  • 静态键的静态类,其中每个键表示 财产
  • DataObject
    ”,其中包含属性名称的字典和作为其值的对象
  • 每个类(任务、订单、传输)实现IDataShare接口:

    公共接口IDataShare
    {
    DataObject ToDataObject();
    void FromDataObject(DataObject数据);
    }

  • 例如,具有以下属性的任务对象:

    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”和“deliveryNote”是用户添加的自定义字段的名称(我不知道用户可能添加哪些字段,所以我只使用字段名)。 当我使用DataObject填充对象时,我必须验证属性的名称是否与键的名称相同,并验证值是否正确(字符串不能插入长字符串)。 此外,自定义列表字段(subcontractor)不能只有itemId作为值,因为当我必须验证对象中自定义字段的listId是否与DataObject中customField的listId相同时

    关于知道值的类型,我有很多问题。我总是要用“X是Y”如果“X是Y”的语句。此外,在实现IDataShare接口时,我必须记住如何存储值的类型,这使得工作更加困难

    有人能帮我考虑一下我可以在从对象到数据对象的转换过程中添加的约束吗?有人能帮我改进这种转换对象的方法吗

    谢谢

    更新
    我想解释一点。我最大的问题是,有几种方法可以转换每个属性/自定义字段,所以我需要记住DataObject中值的类型。例如,在变速器类中,我有VehicleId属性。我想将名为“VehicleId”的自定义字段的任务对象转换为传输。我只想将任务的自定义字段VehicleId的值转换为Transmission的VehicleId属性。但是,因为它是自定义字段(正如我以前写的那样),所以我有一种存储自定义字段的方法,它基于
    列表:{listId:5,Value:4}
    。现在,在转换过程中(从传输中的DataObject),如果DataObject有“VehicleId”键,我必须检查该值是长(vehicle id作为属性)还是IListField(vehicle id作为自定义列表字段)。
    那些类型检查真的很糟糕。

    好吧,如果你转换的类的数量真的像你说的那样有限,我建议你只为你的类编写强制转换操作符好吗

    看起来你在转换中投入的逻辑量足以保证这样的东西。 另一方面,似乎在不同的对象中使用了一组基本字段,而您只是将它们填充到一个非类型化的字典中。如果这些字段在所有类型中都是公共的,您可以使用到强类型公共对象的转换吗? 这也引出了一个问题:您可以使用公共基类对象吗


    如果您有修改任务、订单和传输定义的选项,我将再次查看它们。这种场景看起来像是一种“代码气味”。如果我理解正确的话,
    ToDataObject
    基本上是一个序列化程序,而
    FromDataObject
    是一个反序列化程序。如果这些对象包含的数据是类型兼容的,那么将其序列化为非类型数据的行为似乎就是问题的根源。为什么要这样做,而不仅仅是保持数据的原始格式

    如果由于某些原因无法解决对象之间的不兼容而需要使用适配器,我认为您可以制作一个适配器,至少将数据保留在其本机结构中,而不是将所有内容序列化为字符串。C语言的字典可以包含任何内容,至少你可以使用
    字典


    还不清楚所有这些验证是关于什么的——如果映射相同数据类型的属性,为什么数据会不兼容?例如,假设这是一个内部过程,在什么情况下(例如)一个对象的
    字符串
    会被分配给另一个对象的
    ?似乎只有当数据在一个对象中是强类型的,而在另一个对象中不是强类型的时,才有必要这样做。

    您考虑过使用泛型吗

    如果Task、Order和Transmission都继承自类似基类的属性,那么您可以公开一个获取所需值的通用方法。 GetMyValue(),其中T:Property


    现在还不太清楚你想要达到什么目的。

    @J Trana:谢谢你的回答,现在我有3个类需要转换,但我计划添加更多类似的类(我们正在开发另一个“可转换”类)。将每个对象“转换”为DataObject和从DataObject的解决方案非常方便,因为我不必将每个属性/自定义字段与其他类数据相结合。我最大的问题是,有几种方法可以转换每个属性/自定义字段,所以我需要记住DataObject中值的类型。谢谢您的回答。实际上,我使用字典来存储不同类型的值。但是让我们说