Naresh Kumar
Naresh Kumar

Reputation: 31

Slapper & Dapper Dictionary Support

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

Answers (2)

Naresh Kumar
Naresh Kumar

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

Palle Due
Palle Due

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

Related Questions