如果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
实例,然后创建一个具有相同Name
和Number
的Dog
实例?
例如,如果我有:
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
,如参考文献中所述:
- 从“ 工具”菜单中单击“ NuGet包管理器” ==>“ 包管理器控制台”
-
然后键入以下命令:
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.asax
的Application_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();
它很容易记住,您可以先过滤数据。