gpt4 book ai didi

c# - 如果两个不同类的实例具有相同的属性,如何自动映射它们之间的值?

转载 作者:太空狗 更新时间:2023-10-29 20:01:18 31 4
gpt4 key购买 nike

我有两个类,它们具有完全相同的成员(属性和字段)和相同的数据类型。我想以自动方式将成员从一个成员映射到另一个成员。我知道在开发方面有更多实用的方法可以处理。一个简单的解决方案是手动将每个成员从一个实例映射到另一个实例。但是,我想将其自动化作为一些通用解决方案。

假设您有以下代码:

public MyObject1 AssignTest (MyObject1 obj1, MyObject2 obj2)
{
//Code here for auto map
}

MyObject1MyObject2 具有相同数据类型的完全相同属性。我不想通过并单独分配值(即 MyObject1.Property1 = MyObject2.Property1 等)。是否可以将所有在 MyObject1 中指定的值自动分配给 MyObject2

最佳答案

实现这一点的一种可能性(例如,为了创建您自己的自动映射器或了解它的基本工作原理)是使用(如前所述)Reflection .代码可能如下所示:

// TODO: error handling
// Test classes
public class A
{
public string Name { get; set; }
public int Count;
}

public class B
{
public string Name { get; set; }
public int Count;
}
// copy routine
public B CopyAToB(A a)
{
B b = new B();
// copy fields
var typeOfA = a.GetType();
var typeOfB = b.GetType();
foreach (var fieldOfA in typeOfA.GetFields())
{
var fieldOfB = typeOfB.GetField(fieldOfA.Name);
fieldOfB.SetValue(b, fieldOfA.GetValue(a));
}
// copy properties
foreach (var propertyOfA in typeOfA.GetProperties())
{
var propertyOfB = typeOfB.GetProperty(propertyOfA.Name);
propertyOfB.SetValue(b, propertyOfA.GetValue(a));
}

return b;
}

函数可以这样使用:

var a = new A
{
Name = "a",
Count = 1
};

var b = CopyAToB(a);
Console.Out.WriteLine(string.Format("{0} - {1}", b.Name, b.Count));

输出是:

a - 1

请注意,使用反射是有代价的——它会降低性能。使用反射,您可以访问私有(private)和公共(public)对象成员。例如,这在 Visual Studio 中用于创建测试访问器对象,以便访问所有测试对象成员。

请查看现有的自动映射器(请参阅链接的其他答案)并使用它们而不是自己重新发明轮子 - 现有的库针对速度进行了优化,经过全面测试并且非常使用舒适。通过这种方式,您可以最大限度地减少代码中的错误。

关于c# - 如果两个不同类的实例具有相同的属性,如何自动映射它们之间的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20410234/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com