C#编程-.NET Framework使用工具类简化对象之间的属性复制和操作

举报
Damon小智 发表于 2024/05/24 00:09:06 2024/05/24
【摘要】 在C#编程中,对象之间的属性复制和操作是一个常见的需求。为此,.NET Framework提供了多种实用工具库,如AutoMapper、ValueInjecter和ExpressMapper。这些库通过简化代码,提高了开发效率。本文将介绍这些工具库,比较它们的特点,提供使用示例,并总结它们的优缺点,帮助开发者选择合适的工具库。

一、适用于属性复制的实用工具库

1、工具库列举

在.NET Framework中,有几个常用的工具库可以用于简化对象之间的属性复制和操作。以下是一些常用的库:

工具库名称 支持的.NET版本 安装方式 特点
AutoMapper .NET Framework 4.x, .NET Core, .NET Standard Install-Package AutoMapper 功能强大,社区支持广泛,配置灵活
ValueInjecter .NET Framework 4.x, .NET Core, .NET Standard Install-Package Omu.ValueInjecter 轻量级,简单易用
ExpressMapper .NET Framework 4.x, .NET Core, .NET Standard Install-Package ExpressMapper 高效快速,代码简洁

2、工具库对比

下面是对这些工具库的详细对比:

特性/工具库 AutoMapper ValueInjecter ExpressMapper
安装复杂度 中等 简单 简单
学习曲线 中等
配置灵活性 中等
性能 中等
社区支持 广泛 一般 一般
自定义映射 支持 支持 支持
深度克隆 支持 支持 不支持

二、各工具库使用代码示例

1、AutoMapper

AutoMapper 是一个功能强大的对象映射库,广泛用于企业项目中。下面是一些常用功能的代码示例。

安装

Install-Package AutoMapper

使用示例

① 基本映射
using AutoMapper;

public class Source
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Destination
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Program
{
    public static void Main()
    {
        var config = new MapperConfiguration(cfg => cfg.CreateMap<Source, Destination>());
        var mapper = config.CreateMapper();

        var source = new Source { Name = "Alice", Age = 30 };
        var destination = mapper.Map<Destination>(source);

        Console.WriteLine($"Name: {destination.Name}, Age: {destination.Age}");
    }
}
② 自定义映射
using AutoMapper;

public class Source
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Destination
{
    public string FullName { get; set; }
}

public class Program
{
    public static void Main()
    {
        var config = new MapperConfiguration(cfg => 
        {
            cfg.CreateMap<Source, Destination>()
               .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.FirstName + " " + src.LastName));
        });
        var mapper = config.CreateMapper();

        var source = new Source { FirstName = "John", LastName = "Doe" };
        var destination = mapper.Map<Destination>(source);

        Console.WriteLine($"FullName: {destination.FullName}");
    }
}

2、ValueInjecter

ValueInjecter 是一个轻量级的对象映射库,适用于简单的属性复制场景。

安装

Install-Package Omu.ValueInjecter

使用示例

① 基本映射
using Omu.ValueInjecter;

public class Source
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Destination
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Program
{
    public static void Main()
    {
        var source = new Source { Name = "Alice", Age = 30 };
        var destination = new Destination();
        destination.InjectFrom(source);

        Console.WriteLine($"Name: {destination.Name}, Age: {destination.Age}");
    }
}
② 自定义映射
using Omu.ValueInjecter;

public class Source
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Destination
{
    public string FullName { get; set; }
}

public class CustomInjection : ConventionInjection
{
    protected override bool Match(ConventionInfo c)
    {
        return c.SourceProp.Name == "FirstName" && c.TargetProp.Name == "FullName";
    }

    protected override object SetValue(ConventionInfo c)
    {
        return ((string)c.SourceProp.Value) + " " + ((Source)c.Source).LastName;
    }
}

public class Program
{
    public static void Main()
    {
        var source = new Source { FirstName = "John", LastName = "Doe" };
        var destination = new Destination();
        destination.InjectFrom<CustomInjection>(source);

        Console.WriteLine($"FullName: {destination.FullName}");
    }
}

3、ExpressMapper

ExpressMapper 是一个高效的对象映射库,适用于需要高性能映射的场景。

安装

Install-Package ExpressMapper

使用示例

① 基本映射
using ExpressMapper;

public class Source
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Destination
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Program
{
    public static void Main()
    {
        Mapper.Register<Source, Destination>();
        Mapper.Compile();

        var source = new Source { Name = "Alice", Age = 30 };
        var destination = Mapper.Map<Source, Destination>(source);

        Console.WriteLine($"Name: {destination.Name}, Age: {destination.Age}");
    }
}
② 自定义映射
using ExpressMapper;

public class Source
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Destination
{
    public string FullName { get; set; }
}

public class Program
{
    public static void Main()
    {
        Mapper.Register<Source, Destination>()
              .Member(dest => dest.FullName, src => src.FirstName + " " + src.LastName);
        Mapper.Compile();

        var source = new Source { FirstName = "John", LastName = "Doe" };
        var destination = Mapper.Map<Source, Destination>(source);

        Console.WriteLine($"FullName: {destination.FullName}");
    }
}

三、适用于属性复制的工具库优缺点对比

以下是 AutoMapper、ValueInjecter 和 ExpressMapper 的优缺点对比:

工具库名称 优点 缺点
AutoMapper 功能强大,支持复杂的映射场景
配置灵活,支持自定义映射
社区支持广泛,文档丰富
学习曲线较陡,需要时间熟悉配置
在一些简单场景中可能显得过于复杂
ValueInjecter 轻量级,使用简单
适用于简单的属性复制场景
功能相对有限,支持复杂映射的能力不强
社区支持和文档较少
ExpressMapper 高效快速,性能优异
代码简洁,易于使用
功能相对较少,支持的映射场景有限
社区支持和文档较少
  • AutoMapper 是一个功能强大且配置灵活的工具,适合处理复杂的映射场景,但学习曲线较陡,适合需要高级映射功能的项目。
  • ValueInjecter 是一个轻量级、易于使用的工具,适合处理简单的属性复制场景,但功能有限,适合需要简单映射的项目。
  • ExpressMapper 是一个高效快速的工具,性能优异,适合对性能有较高要求的项目,但功能较少,适合需要简单高效映射的项目。

四、适用于属性复制的实用工具库总结

在选择适用于属性复制的工具库时,需要根据项目的具体需求进行选择。如果需要处理复杂的映射场景,推荐使用AutoMapper;如果仅需要处理简单的属性复制,可以选择ValueInjecter;如果对性能有较高要求,可以选择ExpressMapper。通过合理选择工具库,可以大大简化对象属性复制的代码,提高开发效率。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。