2017-04-27 9 views
2

Dapper 데이터를 개체에 매핑하려고합니다. 그러나 Dictionary 객체에 매핑하는 동안 문제가 발생했습니다.Slapper & Dapper 사전 지원

요구 사항은 데이터 행을 개체에 매핑하는 것입니다.

데이터 행

1 | Key1 | 값 1

1 | Key2 | 값 2

예상 값

아이디 ->1

데이터 - {{"Key1","Value1" }, { "Key2","Value2"}}

지도 번호 :

 IDictionary<string, object> entity = new Dictionary<string, object>(); 
     entity.Add("Id", "1"); 
     entity.Add("Data_Key", new List<string>() { "Key1", "Key2" }); 
     entity.Add("Data_Value", new List<string>() { "Value1", "Value2" }); 
     var result=Slapper.AutoMapper.Map<TestEntity>(entity); 

법인 O 제발

public class TestEntity 
{ 
    public int Id { get; set; } 
    public Dictionary<string,string> Data { get; set; } 
} 

이 방법이 있습니까?

답변

0

나는 그것이 불가능하다고 생각합니다.
사전 데이터에는 KeyValuePairs이 포함되어 있습니다. 이것들은 struct (불변)이므로, 멤버 이 읽기 ​​전용입니다. 따라서 Slapper는 설정할 수 없으며 일반 KeyValuePair 생성자에서만 설정할 수 있습니다.

+0

예 .. 스트레이트 매핑을 통해 달성 할 수 없었습니다. 그래서, 나는 workaround (게시 됨)를해야만했다. 도움 주셔서 감사합니다. –

1

다른 사용자가 언급했듯이 Slapper.Automapper를 통해이를 달성하는 것은 불가능합니다.

그러나이를 달성하기위한 해결 방법을 발견했습니다.

TypeConverter를 만들었습니다. TypeConverter는 JSON String을 받아들이고 Dictionary 객체를 반환합니다.

public class DictionaryConverter : ITypeConverter 
{ 
    public int Order => 110; 

    public bool CanConvert(object value, Type type) 
    { 
     // Handle Nullable types 
     var conversionType = Nullable.GetUnderlyingType(type) ?? type; 
     //Check if Type is a Dictionary 
     return conversionType.IsGenericType && conversionType.GetGenericTypeDefinition() == typeof(Dictionary<,>); 
    } 

    public object Convert(object value, Type type) 
    { 
     // Handle Nullable types 
     var conversionType = Nullable.GetUnderlyingType(type) ?? type; 
     //Create Empty Instance 
     object result = Activator.CreateInstance(type); 
     if (value != null) 
     { 
      try 
      { 
       result = JsonConvert.DeserializeObject(value as string, type); 
      } 
      catch (JsonException ex) 
      { 
       throw new Exception("Invalid JSON String while Converting to Dictionary Object", ex); 
      } 
     } 
     return result; 
    } 
}