假设我有一个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
的实例,并使用相同的Name
和Number
?
例如,如果我有:
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的两个不同部分,所以我不能简单地使它们相关。
答案 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
,如参考文献中所述:
然后输入以下命令:
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();
这很容易记住,您可以先过滤数据。