2016-07-27 2 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; 
     } 

Я создал общий класс под названием Trimmer с перегруженными методами под названием StringTrimmer. Предназначение методов - обрезать любое пространство для свойств объекта Tmodel с помощью Automapper. Он работал нормально, но когда-то это метод, который я получил следующее сообщение об ошибке:спорадическая ошибка при обрезке объекта Свойства с использованием Auto Mapper

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.

Когда это не должно происходить, как я уверен, преобразование того же типа объекта для одного типа объекта.

+0

Что такое TModel, что вызывает эту ошибку? –

+0

TModel - общий тип. В моем случае это просто имя класса, свойства объекта которого я хочу обрезать. Например, если у меня есть класс «Deck», тогда я сделаю «var obj = new Trimmer ()». –

+0

@TimothyGhanem Я нашел проблему и ответим на вопрос, почему я получал ошибки спорадически. Это было одно из многих возможных тестовых примеров, где код даст мне ошибку. Решение заключается в перемещении 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 Я нашел проблему его потому, что я использую Mapper.AssertConfigurationIsValid(); в начале StringTrimmer, когда это должно быть после CreateMap в Mapper.Initialize. В соответствии с тем, почему он работает спорадически

  1. Корпус В соответствии с приведенным ниже кодом. когда основной метод вызывает класс ObjectModifier для обрезки пространства fron Свойства класса данных Mapper.AssertConfigurationIsValid() найдет отображение Data to Data, что означает, что те же свойства в источнике и месте назначения для Карты, таким образом, получают проверку валидации.
  2. Корпус Теперь в следующей строке Мы используем новую карту, которая упоминается в ObjectConverter и конвертирует данные в Datadto, отлично работает.
  3. Дело Теперь в следующей строке снова пытаемся обрезать с помощью StringTrimmer, но теперь, когда выполнение приходит в Mapper.AssertConfigurationIsValid(), оно не будет действительным, так как Mapper удерживает контекст предыдущей Карты, которая находится из ObjectConverter, а теперь Data and Datadto имеет некоторые свойства, которые на самом деле не такие, как «lastName» в Data, «нет» в Datadto. Таким образом, Fails. Это один из тех случаев, когда я придумал, и он подходит к некоторым объяснениям, которые я ищу для спорадического провала.

Благодаря

Смежные вопросы