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

假设我有一个看起来像这样的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实例,然后创建一个具有相同NameNumberDog实例?

例如,如果我有:

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

我知道我不能简单地去:

 Dog dog = person; 

因为它们是两种不同的类型。 但是在C#中是否有办法检查“哦,如果它们具有相同的元素,则将Dog的相同元素设置为与Person 。但我觉得必须有一种比执行类似操作更简单的方法:

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

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

您可以使用AutoMapper :

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

然后你可以很容易地:

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

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

  1. 从“ 工具”菜单中单击“ NuGet包管理器” ==>“ 包管理器控制台”
  2. 然后键入以下命令:

     PM> Install-Package AutoMapper 

面向对象的方法。

 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); 

在项目中安装AutoMapper包。

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

 namespace MyApp.App_Start { public class MyAppMapping : Profile { public MyAppMapping() { CreateMap(); //You can also create a reverse mapping CreateMap(); /*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() .ForMember(d => d.Days, conf => conf.ResolveUsing(AppendDogName)); } private static object AppendDogName(Person person) { return "d-" + person.Name; } } } 

然后在Global.asaxApplication_Start方法内初始化您的映射

 protected void Application_Start() { Mapper.Initialize(m => m.AddProfile()); } 

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

 var dog = AutoMapper.Mapper.Map(person); 

如果您不使用大型通用列表,则可以使用LinQ进行操作。

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

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