📜  c# 复制每个属性 - C# (1)

📅  最后修改于: 2023-12-03 15:13:50.980000             🧑  作者: Mango

C# 复制每个属性

在 C# 中,有时候我们需要将一个对象的属性值复制到另一个对象,这时候我们可以手动一个一个复制,也可以使用一些库或框架来实现快捷的属性复制功能。本文将介绍几种在 C# 中复制每个属性的方法。

1. 手动复制属性

手动复制属性是最简单直接的方法,在代码中逐个将源对象的属性值赋给目标对象的相应属性:

class MyClass
{
    public int MyInt { get; set; }
    public string MyString { get; set; }
}

MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();

myClass2.MyInt = myClass1.MyInt;
myClass2.MyString = myClass1.MyString;

手动复制属性的优点是简单易懂,不需要额外引入任何库或框架,缺点是代码会比较冗长,耗费时间和精力。

2. 使用 AutoMapper

AutoMapper 是一个非常流行的 .NET 对象映射库,在使用之前需要安装 AutoMapper 包。通过配置 AutoMapper,我们可以将源对象的属性值自动复制到目标对象的相应属性:

class MyClass
{
    public int MyInt { get; set; }
    public string MyString { get; set; }
}

MyClass myClass1 = new MyClass() { MyInt = 1, MyString = "Hello" };

var configuration = new MapperConfiguration(cfg => cfg.CreateMap<MyClass, MyClass>());
var mapper = configuration.CreateMapper();
MyClass myClass2 = mapper.Map<MyClass>(myClass1);

// myClass2.MyInt == 1 && myClass2.MyString == "Hello"

AutoMapper 的优点是可以通过简单的配置自动生成属性映射代码,大大简化了对象属性复制的工作,但缺点是需要引入 AutoMapper 库,代码有一定的学习和配置成本。

3. 使用 Reflection

Reflection 是 C# 中的一种元数据机制,它允许我们在运行时动态地检查、查询和修改对象的结构和行为。我们可以使用 Reflection 来获取对象的所有属性和属性值,然后将这些值复制到另一个对象:

class MyClass
{
    public int MyInt { get; set; }
    public string MyString { get; set; }
}

MyClass myClass1 = new MyClass() { MyInt = 1, MyString = "Hello" };
MyClass myClass2 = new MyClass();

var properties = typeof(MyClass).GetProperties();
foreach (var property in properties)
{
    var value = property.GetValue(myClass1);
    property.SetValue(myClass2, value);
}

// myClass2.MyInt == 1 && myClass2.MyString == "Hello"

Reflection 的优点是可以动态地获取对象的属性和属性值,具有很强的灵活性,但缺点是运行时反射的性能开销比较大,代码也比较繁琐。

4. 使用第三方库

除了 AutoMapper 之外,C# 社区还有一些其他的对象映射库,比如 FastMapper、Mapster 等。这些库也可以很方便地实现属性复制的功能,具体用法可以参考官方文档。

总之,在 C# 中复制每个属性有很多种方法,我们可以根据具体情况选择最适合自己的方法。手动复制属性虽然冗长但直观,AutoMapper 能自动生成映射代码但需要引入库,Reflection 具有灵活性但运行时反射性能开销较大,第三方库则各有特点,需要根据项目需求进行选择。