Reputation: 31
I am trying to map Dapper Data to an Object. But am facing problem while mapping to Dictionary objects.
The Requirement is to map a Data Row to an Object.
Data Row
1 | Key1 | Value1
1 | Key2 | Value2
Expected Values
Id -> 1
Data -{{"Key1","Value1" }, { "Key2","Value2"}}
Map Code:
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);
Entity Object
public class TestEntity
{
public int Id { get; set; }
public Dictionary<string,string> Data { get; set; }
}
Is there a way to achieve this ??
Upvotes: 2
Views: 776
Reputation: 31
As the other user mentioned, it is impossible to achieve it through Slapper.Automapper.
But, I've found a workaround to achieve it.
I have created a TypeConverter, which accepts a JSON String and returns a Dictionary Object.
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;
}
}
Upvotes: 1
Reputation: 6312
I believe it is impossible.
The dictionary Data contains KeyValuePairs. These are structs (immutable) and as such the members Key and Value are readonly. Hence Slapper isn't able to set them, they can only be set in the generic KeyValuePair constructor.
Upvotes: 0