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

3bygqnnd  于 2023-02-10  发布在  .NET
关注(0)|答案(9)|浏览(295)

我写了一个函数,它可以将一个类的属性复制到另一个类中,因此可以复制一个对象。
比如说

MyObject myObject = myOtherObject.MyCustomCopy(myObject)

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

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

我很确定在过去我使用了一个. NET对象,它自动地完成了这件事,我猜是通过反射,但是我不记得了...或者我想象这样的方法存在?
是的,我知道自动Map器,但我确信(现在不太确定)有一个. NET对象可以完成这项工作。

oaxa6hgo

oaxa6hgo2#

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));
        }
    }
}
jucafojl

jucafojl3#

您应该使用AutoMapper,它是为此作业构建的。

t8e9dugd

t8e9dugd6#

这段代码应该适用于基本的属性类型,不确定它是否适用于任何复杂的类型(列表、数组、自定义类)。

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);
}
lvmkulzt

lvmkulzt7#

我知道OP没有要求将一个类型转换为另一个类型,但我的变体是我在startup.cs中用于DI的,用于云和本地开发环境之间的配置不匹配。我的本地类通常在后台使用接口类来Map配置。然后我使用此方法来复制属性,仅在名称匹配的地方复制属性。我不检查属性类型,因为这些是配置。有人建议使用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));
        }
      }

    }
  }
oalqel3c

oalqel3c8#

简单来说:正如我们所知,类是C#.NET中的引用类型,即当我们创建类的对象时,例如

Customer C1=new Customer();
C1.Id=1;
C1.Name="Rakesh";

然后,C1(引用变量)存储在内存堆栈上,对象new Customer()存储在堆上。
因此,当我们复制一个类到另一个类,这基本上是你的问题,你可以这样做:

Customer C2=C1;

做以上将复制C1引用变量到C2但为什么我写堆栈和堆,因为使用C2引用变量,你可以改变对象属性是C1和C2指向同一对象在堆.

C2.Id=1;
C2.Name="Mukesh";

现在,如果您尝试访问C1.Name,您将看到它已更改为“Mukesh”。

7cjasjjr

7cjasjjr9#

你可以像这样使用JsonConvert:

string jsonString = JsonConvert.SerializeObject(MyObject);
MyClass object = JsonConvert.DeserializeObject<MyClass>(jsonString);

相关问题