2017-04-27 91 views
2

我想将Dapper数据映射到对象。但在映射到Dictionary对象时遇到问题。Slapper&Dapper字典支持

要求是将数据行映射到对象。

数据行

1 | Key1 | Value1

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); 

实体Ø bject

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

有没有办法实现这个?

回答

0

我相信这是不可能的。
该字典数据包含KeyValuePairs。这些是结构(不可变的),因此成员是只读的。因此,Slapper无法设置它们,它们只能在通用的KeyValuePair构造函数中设置。

+0

是的..我无法通过直接映射来实现它。所以,我必须做一个解决方法(发布)。 感谢您的帮助。 –

1

正如其他用户提到的,它是不可能通过Slapper.Automapper实现的。

但是,我找到了一个解决方法来实现它。

我已经创建了一个TypeConverter,它接受一个JSON字符串并返回一个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; 
    } 
}