2016-09-15 37 views
1

說我有一個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的實例與NameNumber相同?

例如,如果我有:

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,所以我不能簡單地讓他們無論是相關的。

+3

你可以看一下[AutoMapper](http://automapper.org/) –

+0

如果'Dog'和'Person'不是同一個基類的子類,那麼它不會遵循你可以簡單地克隆一個,並使其成爲另一個。但是,您可以通過枚舉兩個對象實例的屬性並根據需要調用'get'和'set'訪問器來實現此目的。 –

回答

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第一作爲參考中提到:

  1. 工具菜單中點擊NuGet軟件包管理器 ==>軟件包管理器控制檯
  2. 然後鍵入以下命令:

    PM> Install-Package AutoMapper 
    
0

在項目中安裝AutoMapper包。

作爲最佳實踐(對於Web應用程序),您可以在App_Start文件夾中創建新類(應衍生自Profile),該類將包含項目的所有映射。

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

如果沒有大泛型列表時,您可以使用LINQ做到這一點。

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

這很容易記住,您可以先過濾數據。

相關問題