.NET:是否有一个类将一个类的属性复制到另一个类

时间:2010-11-10 09:27:40

标签: c# .net vb.net

我写了一个函数,它将一个类的属性复制到另一个类,所以制作一个对象的副本。

类似

MyObject myObject = myOtherObject.MyCustomCopy(myObject)

其中myObject和myOtherObject属于同一类型。我这样做是基本上做的

myObject.prop1 = myOtherObject.prop1
myObject.prop2 = myOtherObject.prop2
myObject.prop3 = myOtherObject.prop3
return myObject

我很确定过去我使用的.NET对象是自动执行此操作,通过反思我猜,但不记得了......或者我想象这样的方法存在?

是的我知道自动映射器,但我确信(现在不是很多)有一个.NET对象可以完成这项工作。也许不是!

8 个答案:

答案 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)

尝试此链接中的说明:

.NET Reflection - Copy Class Properties

答案 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”。