2016-07-27 8 views
0
public class Trimmer<TModel> 
    { 
     public Trimmer() 
     { 
      Mapper.Initialize(c => 
      { 
       c.CreateMap<string, string>().ConvertUsing(s => string.IsNullOrEmpty(s) ? s : s.Trim()); 
       c.CreateMap<TModel, TModel>(); 
      }); 
     } 

     /// <summary> 
     /// Function take List of object of type TModel what supplied during initalization and applied trim on every property which is string. 
     /// </summary> 
     /// <param name="models">An model object of type TModel</param> 
     /// <returns>List of objects of type TModel with string properties that are trimmed (leading and trailing spaces removed)</returns> 
     public List<TModel> StringTrimmer(List<TModel> models) 
     { 
      if (models == null) 
      { 
       return null;    
      } 
      var modelList = models.Select(StringTrimmer).ToList(); 
      return modelList; 
     } 

     /// <summary> 
     /// Function take object of type T which one supply during Initalization and applied trim on every property which is string. 
     /// </summary> 
     /// <param name="model">An model object of Type TModel</param> 
     /// <returns>Object of type TModel with string properties that are trimmed (leading and trailing spaces removed)</returns> 
     public TModel StringTrimmer(TModel model) 
     { 
      Mapper.AssertConfigurationIsValid();`enter code here` 
      var mappedObj = Mapper.Map<TModel,TModel>(model); 
      return mappedObj; 
     } 

StringTrimmerというオーバーロードされたメソッドでトリマーと呼ばれるGenericクラスを作成しました。メソッドの目的は、Automapperを使用してTmodelオブジェクトプロパティのためのスペースをトリムすることです。それはうまく働いたが、その後いつかこれらの方法私は、エラー以下だ:自動マッパーを使用したオブジェクトプロパティのトリミング中に散発的なエラーが発生しました

私は同じオブジェクト型に同じオブジェクト型を変換していて、それが起こっすべきではない

Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type.

。私はMapper.AssertConfigurationIsValid()を使用していますので、私は問題を発見したその

+0

このエラーの原因となっているTModelのは何ですか? –

+0

TModelは単なるジェネリック型です。私の場合は、そのオブジェクトのプロパティをトリムしたいだけのクラス名です。たとえば、クラスが "Deck"の場合、 "var obj = new Trimmer ()"とします。 –

+0

@TimothyGhanem私はこの問題を発見しました。なぜ、エラーを散発的に得ているのかという質問に答えます。これは、コードが私にエラーを与える可能性のある多くのテストケースの1つでした。解決策は、Mapper.AssertConfigurationIsValid();を移動することです。内部Mapper.Initialize –

答えて

0
Code 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using Excel = Microsoft.Office.Interop.Excel; 
using AutoMapper; 

namespace ConsoleApplication2 
{ 
public class Data 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 
public class DataDto 
{ 
    public string FirstName { get; set; } 
    public string No { get; set; } 
} 
public class ObjectModifier<TModel> 
{ 
    public ObjectModifier() 
    { 
     Mapper.Initialize(c => 
     { 
      c.CreateMap<string, string>().ConvertUsing(s => string.IsNullOrEmpty(s) ? s : s.Trim()); 
      c.CreateMap<TModel, TModel>(); 
      Mapper.AssertConfigurationIsValid(); 
     }); 
    } 

    public TModel StringTrimmer(TModel model) 
    { 
     Mapper.AssertConfigurationIsValid(); 
     var mappedObj = Mapper.Map<TModel, TModel>(model); 
     return mappedObj; 
    } 
} 

public static class ObjectConverter 
{ 
    public static T2 ToObject<T1, T2>(T1 val) 
    { 
     return Mapper.DynamicMap<T1, T2>(val); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var doc = new Data() 
     { 
      FirstName = "Foo ", 
      LastName = "ooF" 
     }; 
     ObjectModifier<Data> objMod = new ObjectModifier<Data>(); 
     var result = objMod.StringTrimmer(doc); //Good 
     var result2 = ObjectConverter.ToObject<Data, DataDto>(doc); //Good 
     var result3 = objMod.StringTrimmer(doc); //Error 
    } 
} 

}

@TimothyGhanem。 StringTrimmerの開始時に、Mapper.InitializeのCreateMapの後にする必要があります。なぜその動作が散発的であるかによって、

  1. ケース 以下のコードに従って。 mainメソッドがObjectModifierクラスを呼び出してスペースをトリミングする場合、データクラスプロパティMapper.AssertConfigurationIsValid()は、データとデータのマッピングを検出します。これは、マップのソースとデスティネーションの同じプロパティを意味します。
  2. ケース 今すぐ次の行ObjectConverterに記載されている新しいマップを使用して、データをDatadtoに変換します。
  3. ケース StringTrimmerを使用してトリミングしようとしている次の行で、今度はMapper.AssertConfigurationIsValid()に実行が来ると、MapperがObjectConverterからの以前のMapのコンテキストを保持し、DataおよびDatadtoデータ内の "lastName"のように実際には同じではないプロパティをいくつか持っています。したがって、失敗する。これは私が思いついたケースの1つで、散発的な失敗のために私が求めているいくつかの説明に適合しています。

おかげ

関連する問題