2017-08-08 8 views
1

が、私は2つのクラスがあるとし、子プロパティなどの特定の名前のプロパティを無視しますID(Company.IDおよびEmployee.ID)を除くすべてのフィールドAutoMapperは

私はこれを処理するためにAutomapper拡張子を追加しました:

public static IMappingExpression<TSource, TDestination> IgnoreIDs<TSource, TDestination>(
      this IMappingExpression<TSource, TDestination> expression) 
    { 
     var sourceType = typeof(TSource); 
     foreach (var property in sourceType.GetProperties()) 
     { 
      if (property.Name.Contains("ID")) 
       expression.ForMember(property.Name, opt => opt.Ignore()); 
     } 
     return expression; 
    } 

私はそうのようにそれを呼び出す:

Mapper.CreateMap<Company, Company>().IgnoreIDs(); 
Mapper.CreateMap<Employee, Employee>().IgnoreIDs(); 
var mappedCompany = Mapper.Map(changedCompany, existingCompany); 

会社レベル(mappedCompany.ID全くIDプロパティのこの作品 == existingCompany.ID、他のプロパティが変更されている間はchangedCompany.IDは期待通りに無視されます)。

しかし、このアプローチは子のプロパティでは機能しません。それは常にEmployee.IDをゼロに設定します! existingCompanyとchangedCompanyの従業員のプロパティにIDがある場合でも、 "ID"を含むフィールド名はすべて0に設定されます。その他のプロパティはすべて適切にマップされます。

なぜこれを行うのですか?プロパティを無視したりマッピングしたりするのではなく、デフォルトに設定していますか?

(AutoMapperのv3.3.1)

+0

私はAutoMapperを使用したことはありませんが、あなたがsourceTypeをループするだけのプロパティをループしているところではあなたの関数です。子要素を無視するには、子要素をループする必要があると思います。 – Cory

+0

最新バージョンでは、グローバル無視を使用します。 –

+0

それは、子要素がまだ影響を受けているということです。予想された方法ではなく(無視されるのではなくゼロに変更されています)。従業員のプロパティは、2番目のCreateMapが呼び出されたときにループします。 – FBryant87

答えて

1

その後、私はあなたが行うことができると思いますが、リストの順序を使用して従業員のリストをマッピングする(と彼らはietmsの数が同じ)と仮定すると、以下の

Mapper.CreateMap<Company, Company>().ForMember(dest => dest.Employees, 
      opts => opts.Ignore()).IgnoreIDs(); 
Mapper.CreateMap<Employee, Employee>().IgnoreIDs(); 

var mappedCompany = Mapper.Map(changedCompany, existingCompany); 

for (int i = 0; i < existingCompany.Employees.Count; i++) 
{ 
    AutoMapper.Mapper.Map(existingCompany.Employees[i], changedCompany.Employees[i]); 
} 
+0

ありがとうございます - マップする子供がたくさんありますが、これは同じようなアプローチで、プロパティをループしてそれらをすべて調べてみることもできます。 – FBryant87