C# 如何将一个类的对象转换为另一个(其中类成员不同)
我有一个场景,其中我的(objA)为(a类),而(objB)为(B类)。 类A和类B中的成员变量不匹配。 我需要将数据从objA分配到objB。 我四处搜索,找到了与将objA映射到成员变量相同的objB相关的解决方案。但是,当A班和B班的成员不同时,我没有发现任何东西 下面是两个示例类(A类和B类)以给出一个想法C# 如何将一个类的对象转换为另一个(其中类成员不同),c#,C#,我有一个场景,其中我的(objA)为(a类),而(objB)为(B类)。 类A和类B中的成员变量不匹配。 我需要将数据从objA分配到objB。 我四处搜索,找到了与将objA映射到成员变量相同的objB相关的解决方案。但是,当A班和B班的成员不同时,我没有发现任何东西 下面是两个示例类(A类和B类)以给出一个想法 public class Class A { private ABCHeaderType ABCHeaderField; private string title;
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中,并使用下面的代码段进行复制
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
谢谢…您可以创建一个带有基本字段的接口BaseObject,这些字段可以由类A和输出实现:
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个类以一种方式关联,即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模式处理大量的表示。事实上,这正是视图模型——这些字母的一半——的主要目的。在MVVM中,您需要具有更改通知的属性,这些属性通常也接受原始字符串。视图通常没有这些,并且不能修改以获得这些
“如果您不能修改它,请将其包装成您可以修改的内容”。大多数视图类不能被修改或继承。因为他们来自外部,或者他们当前的行为是必需的。因此,您通常必须编写ViewModel类,主要目的是包装这些视图类。(创建VM类还有其他优势,但这些优势往往是MVVM/XAML特有的)。如果两个类的属性名称相同,则有机会做到这一点!在这个帮助下:否则我认为这是不可能的!看看automapper。automapper是一个专门用于此目的的库。如果两个类的成员不同,它们之间的关系如何?也许它们有一个共同的祖先,或者某些属性可以被编码到一个共同的接口中如果您当前的代码有效,您应该继续使用它。我能思考的唯一其他方法是反射。反射是一种很好的回退方法,但决不能用作有效/主要的解决方案。反射是你使用的(如果你还没有)像你所展示的转换器代码。@克里斯托弗,这2个类的关系是考虑Obja是来自一个系统的传入对象,Objb是发送到另一个其他系统的对象。但是objB需要来自objA的数据