如果Items等效,则将项目从一个类映射到另一个类

时间:2016-09-15 16:19:42

标签: c# class oop mapping

假设我有一个class,如下所示:

public class Person
{
     public string Name {get; set;}
     public int Number {get; set;}
}

另一个看起来像这样:

public class Dog
{
     public string Name {get; set;}
     public int Number {get; set;}
}

它们是两个不同的类,但它们碰巧具有完全相同的元素(一个名为Name的字符串和一个名为Number的int)

在C#中是否有一种简单的方法,比方说,如果我有一个Person的实例,然后创建一个Dog的实例,并使用相同的NameNumber

例如,如果我有:

Person person = new Person();
person.Name = "George";
person.Number = 1;

我知道我不能去:

Dog dog = person;

因为它们是两种不同的类型。但是在C#中有没有办法检查"哦,如果它们具有相同的元素,则将Dog的相同元素设置为等于Person的元素。 但我觉得必须有一种比做某事更简单的方法:

dog.Name = person.Name;
dog.Number = person.Number;

特别是如果这个类有很多元素。此外,如果有人想知道,这两个不同的类在API的两个不同部分,所以我不能简单地使它们相关。

4 个答案:

答案 0 :(得分:4)

您可以使用AutoMapper

public Dog UsingAMR(Person prs)
{
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<Person, Dog>();
    });
    IMapper mapper = config.CreateMapper();
    return mapper.Map<Person, Dog>(prs);
}

然后你可以轻松地:

Person ps = new Person {Name = "John", Number = 25};
Dog dog = UsingAMR(ps);

请不要忘记从包管理器控制台首先安装AutoMapper ,如参考文献中所述:

  1. 工具菜单中点击 NuGet Package Manager ==&gt; 程序包管理器控制台
  2. 然后输入以下命令:

    PM> Install-Package AutoMapper
    

答案 1 :(得分:0)

在项目中安装AutoMapper包。

作为最佳实践(对于Web应用程序),您可以在Profile文件夹中创建新类(应该来自App_Start),该类将包含项目的所有映射。

namespace MyApp.App_Start
{
    public class MyAppMapping : Profile
    {
        public MyAppMapping()
        {

            CreateMap<Person, Dog>();

            //You can also create a reverse mapping
            CreateMap<Dog, Person>();

            /*You can also map claculated value for your destination. 
            Example: you want to append "d-" before the value that will be
            mapped to Name property of the dog*/

            CreateMap<Person, Dog>()
            .ForMember(d => d.Days, 
             conf => conf.ResolveUsing(AppendDogName)); 
        }

        private static object AppendDogName(Person person)
        {
            return "d-" + person.Name;
        }
    }
}

然后在Application_Start

中的Global.asax方法内初始化您的映射
protected void Application_Start()
{
    Mapper.Initialize(m => m.AddProfile<MyAppMapping>());
}

您现在可以使用已创建的映射

var dog = AutoMapper.Mapper.Map<Person, Dog>(person);

答案 2 :(得分:0)

面向对象的方法。

public class Mammal
{
    public Mammal(Mammal toCopy)
    {
        Name = toCopy.Name;
        Number = toCopy.Number;
    }
    public string Name {get; set;}
    public int Number {get; set;}
}
public class Person: Mammal
{
    public Person(Mammal toCopy) {} /* will default to base constructor */
}

public class Dog: Mammal
{
    public Dog(Mammal toCopy) {} /* will default to base constructor */
}

这将允许以下内容:

Person person = new Person();
person.Name = "George";
person.Number = 1;
Dog dog = new Dog(person);

答案 3 :(得分:0)

如果您不使用大型通用列表,可以使用LinQ。

var persons = new List<Person>();
// populate data [...]
var dogs = persons.Select(p=>new Dog{Name=p.Name,Number=p.Number}).ToList();

这很容易记住,您可以先过滤数据。