C# 在同一方法中映射类或其子类

C# 在同一方法中映射类或其子类,c#,.net,mapping,C#,.net,Mapping,Edit:我刚刚意识到,在输入这个问题时,使用泛型可以实现一个简单的解决方案。我正在测试它,不久将发布它 给定两个实体类(例如,从数据库加载数据): …以及以下我想映射到的“目标”类: class Person { public string Name{ get; set; } } class Child : Person { public int Age {get; set; } } 现在假设我已经编写了一个映射方法,用于将PersonFromDb映射到Person: pu

Edit:我刚刚意识到,在输入这个问题时,使用泛型可以实现一个简单的解决方案。我正在测试它,不久将发布它

给定两个实体类(例如,从数据库加载数据):

…以及以下我想映射到的“目标”类:

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

class Child : Person
{
    public int Age {get; set; }
}
现在假设我已经编写了一个映射方法,用于将
PersonFromDb
映射到
Person

public Person MapPerson(PersonFromDb person){ 
   return new Person { 
       Name = person.NameFromDb, 
       // ...
   }
}
以及另一种映射子对象的方法:

public Child MapChild(ChildFromDb child){ ... }
不过,我想在这里做的是从
MapChild()
中映射调用
MapPerson()
,以避免重新映射所有公共属性

但是,我不能将
MapPerson()
Child
一起使用,因为它返回的是
Person
,而不是
Child


有没有什么模式可以帮助我解决这个问题,这样我就不必在这里重复这么多映射逻辑了?

正如我在编辑中提到的,我在写这个问题时意识到,有一个使用泛型的简单解决方案:

public T MapPerson<T>(PersonFromDb person) where T : Person, new() { 
   return new T { 
       Name = person.NameFromDb, 
       // ...
   }
}
publicmapperson(PersonFromDb-person),其中T:person,new(){
返回新的T{
Name=person.NameFromDb,
// ...
}
}
这将考虑以下两个方面:

Person mappedPerson = MapPerson<Person>(instanceOfPersonFromDb);

Child mappedChild = MapPerson<Child>(instanceOfChildFromDb.Person);
Person-mappedPerson=MapPerson(instanceOfPersonFromDb);
Child mappedChild=MapPerson(instanceOffChildFromDB.Person);

然后,我可以从
MapChild()
调用后者,允许我映射
MapPerson()
中的公共属性,然后添加
Child
中定义的额外属性,然后在
MapChild()
中创建泛型person mapper,它将创建并映射任何人员类型,其中包含无参数构造函数:

public <TPerson> MapPerson<TPerson>(PersonFromDb dbPerson){ 
   where TPerson: Person, new()
   return new TPerson { 
       Name = dbPerson.NameFromDb, 
       // ...
   }
}
publicmapperson(PersonFromDb-dbPerson){
其中TPerson:Person,new()
返回新的TPerson{
Name=dbPerson.NameFromDb,
// ...
}
}
然后使用此通用人员映射器映射子对象:

public Child MapChild(ChildFromDb dbChild)
{
    var child = MapPerson<Child>(dbChild.Person);
    child.Age = dbChild.AgeFromDb;
    return child;
}
公共子映射子对象(childfromdbchild)
{
var child=MapPerson(dbChild.Person);
child.Age=dbChild.AgeFromDb;
返回儿童;
}

您可以依靠像AutoMapper这样的映射框架来完成这项工作

另一个解决方案是使用接口而不是继承。定义将由Person et子对象实现的IPerson接口。然后,您的MapPerson函数可以类似于MapPerson(IPerson目标,PersonFromDb源),它将初始化目标对象,因此能够初始化Person或子对象


或者您可以使用合成而不是继承,并将Person对象作为子对象的属性。

您听说过吗?听说过,但还没有真正研究过。不过我会的,谢谢!快回答!正如我在编辑中提到的,当我刚写完问题时,我自己就意识到了这一点。不管怎样,我还是决定发布它,并且我已经发布了我自己的答案(基本上与你的答案相同)。不过我还是会给你支票的。。。谢谢!;)
public Child MapChild(ChildFromDb dbChild)
{
    var child = MapPerson<Child>(dbChild.Person);
    child.Age = dbChild.AgeFromDb;
    return child;
}