You could use a Mapper. A Mapper maps one Type
to another Type
where the property names are the same, the other Type
must have a default constructor. A popular Mapper is AutoMapper the one used here is a home-brewed version but the syntax is similar.
List<Animal> animals = new List<Animal>
{
new Animal(){Name="Dog",Legs=4},
new Animal(){Name="Human",Legs=2},
new Animal(){Name="Spider",Legs=8}
};
List<Animal2> animals2 = new List<Animal2>
{
new Animal2(){Name="Insect",Legs=6},
new Animal2(){Name="Fish",Legs=0}
};
Mapper<Animal2, Animal> myMapper=new Mapper<Animal2, Animal>();
var query = animals2.Select(a => myMapper.Map(a));
animals.AddRange(query);