我写了一个函数,它将一个类的属性复制到另一个类,所以制作一个对象的副本。
类似
MyObject myObject = myOtherObject.MyCustomCopy(myObject)
其中myObject和myOtherObject属于同一类型。我这样做是基本上做的
myObject.prop1 = myOtherObject.prop1
myObject.prop2 = myOtherObject.prop2
myObject.prop3 = myOtherObject.prop3
return myObject
我很确定过去我使用的.NET对象是自动执行此操作,通过反思我猜,但不记得了......或者我想象这样的方法存在?
是的我知道自动映射器,但我确信(现在不是很多)有一个.NET对象可以完成这项工作。也许不是!
答案 0 :(得分:10)
您可以查看AutoMapper。
答案 1 :(得分:5)
您应该使用为此工作而构建的AutoMapper。
答案 2 :(得分:5)
public static class ext
{
public static void CopyAllTo<T>(this T source, T target)
{
var type = typeof(T);
foreach (var sourceProperty in type.GetProperties())
{
var targetProperty = type.GetProperty(sourceProperty.Name);
targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null);
}
foreach (var sourceField in type.GetFields())
{
var targetField = type.GetField(sourceField.Name);
targetField.SetValue(target, sourceField.GetValue(source));
}
}
}
答案 3 :(得分:2)
答案 4 :(得分:1)
尝试此链接中的说明:
答案 5 :(得分:1)
此代码应该适用于基本属性类型,不确定它将如何用于任何复杂的(列表,数组,自定义类)。应该是一个起点:
public class MyClass
{
public int A { get; set; }
public string B { get; set; }
}
private void button1_Click(object sender, EventArgs e)
{
MyClass orig = new MyClass() { A = 1, B = "hello" };
MyClass copy = new MyClass();
PropertyInfo[] infos = typeof(MyClass).GetProperties();
foreach (PropertyInfo info in infos)
{
info.SetValue(copy, info.GetValue(orig, null), null);
}
Console.WriteLine(copy.A + ", " + copy.B);
}
答案 6 :(得分:1)
我知道 OP 没有要求将类型转换为另一种类型,但我的变体是我在 startup.cs 中用于 DI 的变体,因为云和本地开发环境之间的配置不匹配。我的本地类通常在幕后使用接口类来映射配置。然后我使用此方法复制仅在名称上匹配的属性。我没有检查属性类型,因为这些是配置。建议使用 AutoMapper。我不使用 AutoMapper,因为我们被美国国防部限制为某些提供商。仅使用 .NET 就很难获得 ATO,我们无需再悲伤。
using System.Linq;
public static class PropertyCopy
{
public static void CopyAllTo<T,T1>(this T source, T1 target)
{
var type = typeof(T);
var type1 = typeof(T1);
foreach (var sourceProperty in type.GetProperties())
{
foreach (var targetProperty in type1.GetProperties()
.Where(targetProperty => sourceProperty.Name == targetProperty.Name)
.Where(targetProperty => targetProperty.SetMethod != null))
{
targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null);
}
}
foreach (var sourceField in type.GetFields())
{
foreach (var targetField in type1.GetFields()
.Where(targetField => sourceField.Name == targetField.Name))
{
targetField.SetValue(target, sourceField.GetValue(source));
}
}
}
}
答案 7 :(得分:0)
用非常简单的术语:我们知道Classes是C#.NET中的引用类型,即当我们创建类的对象时,例如
Customer C1=new Customer();
C1.Id=1;
C1.Name="Rakesh";
然后C1(引用变量)存储在内存堆栈中,对象新的Customer()存储在堆中。
因此,当我们将一个类复制到另一个基本上是您的问题的类时,您可以执行以下操作:
Customer C2=C1;
上面的操作会将C1 Reference变量复制到C2但是为什么我写了Stack和Heap,因为使用C2引用变量你可以改变对象属性,同时指向同一对象的C1和C2在HEAP.Something Like
C2.Id=1;
C2.Name="Mukesh";
现在,如果您尝试访问C1.Name
,您会看到它已更改为“Mukesh”。