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

时间:2019-03-26 03:37:36

标签: c# .net-core

我是C#,dotnet核心的新手。我正在从数据库中获取数据,如下所示。该数据非常平坦。我需要转换为另一个对象。

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进行转换。

4 个答案:

答案 0 :(得分:2)

由于LeadDtoLeadCustomer取决于Lead

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

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

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

然后您可以使用

LeadDto myObj = someLead.ToLeadDto();

还有另一个选择是使用诸如AutoMapper之类的库。我从来没有使用过它,对于您的需求,IMO来说是过大了。

答案 1 :(得分: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耦合,则可以在Lead的构造函数中使用LeadDto对象作为参数本身。

从Lead到LeadDto映射属性时,请务必慎重考虑LeadPriorityLeadStatus,因为它们根据结构或类而有所不同。

答案 2 :(得分:2)

互联网上有许多映射器库。仅举几例

  • 自动映射器
  • 地图
  • emitmapper

他们每个人都有自己的优点和缺点。 我个人认为编写自己的mapper方法是值得的,因为您将完全控制自己编写的内容。

我同意可能要花一些时间,但不会花很长时间。

答案 3 :(得分:0)

按照@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
                };
            }));