2016-09-15 5 views
1

は、私はこのようになります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;} 
} 

彼らは2つの異なるクラスですが彼らはまったく同じ要素(Nameと呼ばれる文字列とNumberと呼ばれる文字列)を持っています

C#の簡単な方法はありますか?たとえば、Personというインスタンスがあり、のインスタンスを作成して同じNameNumberとすると、例えば

は私が持っていた場合:

Person person = new Person(); 
person.Name = "George"; 
person.Number = 1; 

私は単純に行くことができない知っている:彼らは二つの異なるタイプがある

Dog dog = person; 

ので。 。しかし、彼らは同じ要素を持っている場合ああ、Personのことに等しくなるようにDogの同じ要素を設定 」をチェックするC#での方法があります。しかし、私のような何かを行うよりも簡単な方法がなければならないと感じ:

クラスは、要素をたくさん持っている場合は特に
dog.Name = person.Name; 
dog.Number = person.Number; 

。また、誰もが疑問に思っている場合、これら2つの異なるクラスは、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); 
} 

そして、あなたが簡単にできます。

  1. ツールメニューをクリックから上:

    Person ps = new Person {Name = "John", Number = 25}; 
    Dog dog = UsingAMR(ps); 
    

    は、参考までに述べたように、パッケージマネージャコンソールからAutoMapper最初をインストールすることを忘れないでくださいNuGetパッケージマネージャ ==>パッケージマネージャコンソール

  2. は、その後、次のコマンドを入力します。

    PM> Install-Package AutoMapper 
    
0

プロジェクトでAutoMapperパッケージをインストールします。

ベストプラクティス(ウェブアプリケーション用)として、から派生する新しいクラスを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; 
     } 
    } 
} 

その後、あなたは今、あなたは

var dog = AutoMapper.Mapper.Map<Person, Dog>(person); 
0

オブジェクト指向のアプローチを作成したマッピングを使用することができますGlobal.asax

protected void Application_Start() 
{ 
    Mapper.Initialize(m => m.AddProfile<MyAppMapping>()); 
} 

Application_Startメソッド内で、あなたのマッピングを初期化します。

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

あなたは大きなジェネリックリストでは動作しない場合は、きゅうを使用してそれを行うことができます。

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

以前はデータをフィルタリングすることができます。

関連する問題