【问题标题】:How to convert a object of one class to another (where the class members are different)如何将一个类的对象转换为另一个类(类成员不同)
【发布时间】:2019-11-22 05:55:31
【问题描述】:

我有一个场景,其中我有(A 类)的(objA)和(B 类)的(objB)。 A 类和 B 类中的成员变量不匹配。 我需要将数据从 objA 分配给 objB。 我四处搜索并找到了与将 objA 映射到成员变量相同的 objB 相关的解决方案。但是当A类和B类的成员不同时,我没有发现任何东西。

以下是 2 个示例类(A 类和 B 类),供您参考。

public class Class A
{
    private ABCHeaderType ABCHeaderField;
    private string title;
    private string date;
    private string id;
    private string location;
    private string status;
    private string hashNumber;      
    .....skipped getter setters     
}   
public class ABCHeaderType { 
    private string version;    
    private string outputTypeField;    
    private int langCd;       
    private string dateTime;    
    private string hashField;
        .....skipped getter setters
}

public class Class B
{
    public Input input { get; set; }

}
public class Input
{
    public Output output{ get; set; }
}
public class Output
{
    public string Title { get; set; }
    public string Date { get; set; }
    public string id { get; set; }
    public string location { get; set; }
    public string Status { get; set; }
    public string laterDate { get; set; }
    public string hashNumber { get; set; }
    public Info info { get; set; }
}
public class Info
{
    public string name { get; set; }
    public string ht { get; set; }
    public string type { get; set; }
    public string res { get; set; }
    public string wd { get; set; }
    public string ornt { get; set; }
}

现在我正在使用转换器类将 objA 复制到 objB 中,并使用下面的代码 sn-p 进行复制

objB.input.output.Title = objA.Title;
objB.input.output.Date = objA.Date;
objB.input.output.id = objA.id;
objB.input.output.location = objA.location;
objB.input.output.Status = objA.Status;
objB.input.output.hashNumber = objA.hashNumber;

objB.input.output.inf.type = objA.ABCHeaderField.outputTypeField

谢谢...

【问题讨论】:

  • 如果两个类的属性名称相同,那么就有机会这样做!在这个的帮助下:stackoverflow.com/a/4144817/7124761 否则我认为这是不可能的!
  • 看看 automapper。 automapper 是一个为此目的而设计的库。
  • 如果它们的成员不同,这两个类有什么关系?也许它们有一个共同的祖先,或者某些属性可以编码成一个共同的接口? |如果您当前的代码有效,您应该继续使用它。我能想到的唯一其他方法是使用反射。反射是一个很好的后备方案 - 但绝不应该用作有效/主要的解决方案。如果您(还)没有像您展示的那样的转换器代码,则使用反射。
  • @Christopher,这两个类以某种方式相关 - 考虑 objA 是来自一个系统的传入对象,而 objB 是发送到另一个不同系统的对象。但是 objB 需要来自 objA 的数据

标签: c#


【解决方案1】:

您可以创建一个接口BaseObject,其基字段可由A类和Output实现:

public interface BaseObject
{
    string Title { get; set; }
    string Date { get; set; }
    string id { get; set; }
    string location { get; set; }
    string Status { get; set; }
    string laterDate { get; set; }
    string hashNumber { get; set; }
    Info info { get; set; }
}
public class A : BaseObject
{
    public string Title { get; set; }
    public string Date { get; set; }
    public string id { get; set; }
    public string location { get; set; }
    public string Status { get; set; }
    public string laterDate { get; set; }
    public string hashNumber { get; set; }
    public Info info { get; set; }
  // your code....
}
public class B
{
    public Input Input { get; set; }
}
public class Input
{
    public BaseObject Output{ get; set; }
}

public class Output : BaseObject
{
    public string Title { get; set; }
    public string Date { get; set; }
    public string id { get; set; }
    public string location { get; set; }
    public string Status { get; set; }
    public string laterDate { get; set; }
    public string hashNumber { get; set; }
    public Info info { get; set; }
}

然后你就可以做到了:

var objB = new B
{
     Input = new Input
     {
        Output = new A()
      }
};

如果obejct被初始化并且被初始化字段输入:

objB.Input.Output = objA;

【讨论】:

    【解决方案2】:

    来自cmets:

    这 2 个类以某种方式相关 - 考虑 objA 是来自一个系统的传入对象,而 objB 是发送到另一个不同系统的对象。但是 objB 需要来自 objA 的数据

    “共享数据”类怎么样?双方在所有领域都有共同点。根据具体情况,只读结构可能会更好——否则您可能需要克隆。

    public readonly struct SharedData{
        public readonly string Title;
        public readonly string Date;
        public readonly string id;
        public readonly string location;
        public readonly string Status;
        public readonly string laterDate;
        public readonly string hashNumber;
    }
    

    MVVM 模式处理了大量的表示。事实上,这就是 View Model 的大部分内容——其中一半是这些字母——的用途。在 MVVM 中,您需要带有更改通知的属性,通常也是接受原始字符串的属性。视图通常没有这些 - 并且无法修改以获取这些。

    “如果你不能修改它,把它包装成你可以修改的东西”。大多数视图类不能修改或继承。因为它们来自某些外部来源,或者需要它们当前的行为。因此,您通常必须编写 ViewModel 类,其主要目的是包装这些 View 类。 (制作 VM 类还有其他优势,但这些优势往往是 MVVM/XAML 特定的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2011-04-10
      • 2011-03-15
      相关资源
      最近更新 更多