在C#中将一个对象转换为另一个对象

3

我是C#和dotnet core的新手。我从数据库获取数据,如下所示。这些数据非常平面化。我需要将其转换为另一个对象。

public class Lead
    {
        public long Id { get; set; }

        public short LeadCreatorId { get; set; }

        public short LeadOwnerId { get; set; }

        public string ProductId { get; set; }

        public LeadPriority Priority { get; set; }

        public LeadStatus Status { get; set; }

        public long LeadCustomerId { get; set; }  

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string EmailAddress { get; set; }

        public string MobileNo { get; set; }

        public DateTime CreatedOn { get; set; }
    }

我需要将其转换为以下对象。
public class LeadDto
    {
        public long Id { get; set; }

        public short LeadCreatorId { get; set; }

        public short LeadOwnerId { get; set; }

        public string ProductId { get; set; }

        public LeadPriority Priority { get; set; }

        public LeadStatus Status { get; set; }

        public LeadCustomer LeadCustomer { get; set; }

        public DateTime CreatedOn { get; set; }
    }

LeadCustomer 如下所示 -
public class LeadCustomer{

            public long Id { get; set; }

            public string FirstName { get; set; }

            public string LastName { get; set; }

            public string EmailAddress { get; set; }

            public string MobileNo { get; set; }
}

我该如何轻松地完成这个任务呢?我可以使用DTO进行转换吗?


1
AutoMapper是最简单的方式,虽然不一定是最高效的。 - ProgrammingLlama
界面是我首先想到的,但这取决于您要如何处理LeadDto和LeadCustomer对象。 - Leisen Chang
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/explicit - mjwills
4个回答

4

网络上有许多映射库,其中几个常见的包括:

  • automapper
  • mapster
  • emitmapper

它们都有各自的优点和缺点。我个人认为编写自己的映射方法值得一试,因为这样你可以完全控制你所写的内容。

我同意这可能需要一些时间,但并不需要太长时间。


3

由于LeadDtoLeadCustomer依赖于Lead:

一种选择是在LeadDtoLeadCustomer中添加构造函数,该构造函数以Lead对象作为参数并映射到属性。

另一种选择是创建一个静态扩展方法。

public static LeadDto ToLeadDto(this Lead lead)
{
   return new LeadDto(){
      this.Id = lead.Id;
      // Etc..
   }
}

那么你可以像这样使用:
LeadDto myObj = someLead.ToLeadDto();

另一个选择是使用像AutoMapper这样的库。我从未使用过它,但在我看来,对于你所述的需求来说有些过头了。


2
一个简单直接的方法是在Lead类上有一个函数来返回你需要的对象。"最初的回答"
public class Lead
{
    //// your properties
    public LeadDto GetOtherObject()
    {
        LeadDto object = new LeadDto();
        ////Map properties from this to object
        return object;
    }
}

如果上述方法在给定的上下文中不合适,您可以拥有静态实用程序函数。"最初的回答"
public static class Utility
{
    public static LeadDto GetOtherObject(Lead leadObject)
    {
        LeadDto object = new LeadDto();
        ////Map properties from leadObject to object
        return object;
    }
}

如果LeadDto的耦合仅与Lead相关,则可以在LeadDto的构造函数中将Lead对象作为参数本身。
在从Lead到LeadDto映射属性时,请务必小心考虑LeadPriorityLeadStatus,因为它们可能会根据它们是结构体还是类而有所不同。"LeadPriority"翻译成"潜在客户优先级","LeadStatus"翻译成"潜在客户状态"。

1

如@G_S所建议的那样,我使用了以下自动映射器 -

        CreateMap<Lead, LeadDto>()
            .ForMember(desc => desc.LeadCustomer, opt => opt.ResolveUsing(src =>
            {
                return new LeadCustomer()
                {
                    Id = src.LeadCustomerId,
                    FirstName = src.FirstName,
                    LastName = src.LastName,
                    EmailAddress = src.EmailAddress,
                    MobileNo = src.MobileNo
                };
            }));

你还需要一个从Lead到LeadCustomer的映射,以及 ForMember(desc => desc.LeadCustomer, opt => opt.MapFrom(src => src) - Lucian Bargaoanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接