2017-04-27 9 views
2

Dapperデータをオブジェクトにマップしようとしています。しかし、Dictionaryオブジェクトにマッピングする際に問題に直面しています。Slpper&Dapper Dictionary Support

要件は、データ行をオブジェクトにマップすることです。

データ行

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が含まれています。これらは構造体(不変)なので、メンバーの値が読み込まれます。したがって、Slapperはそれらを設定できません。一般的なKeyValuePairコンストラクタでのみ設定できます。

+0

ええ..私はストレートマッピングでは達成できませんでした。だから、回避策を講じなければなりませんでした(投稿)。 ご協力いただきありがとうございます。 –

1

他のユーザーが言いましたように、Slapper.Automapperでこれを実現することはできません。

しかし、私はそれを達成するための回避策を見つけました。

私は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; 
    } 
}