2017-01-18 7 views
2

と一般的なマッピングを作成するには?どのように私はマップの構成を有しているAutoMapperとConstructUsing

TタイプはIDictionary<int, T>からList<T>に変換したいと思います。

私は非常に醜い解決策が見つかりました:これを行うには任意の簡単な方法があります

static IEnumerable<DictionaryEntry> CastDictionaryEntry(IEnumerable dict) 
{ 
    foreach (var item in dict) 
    { 
     yield return (DictionaryEntry)item; 
    } 
} 

cfg.CreateMap(typeof(IDictionary<,>), typeof(List<>)).ConstructUsing(
    x0 => 
    { 
     if (x0 == null) 
     { 
      return null; 
     } 

     var dict = (IEnumerable)x0; 
     var type = x0.GetType().GetGenericArguments()[1]; 
     var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type)); 
     CastDictionaryEntry(dict).OrderBy(x => x.Key).ForEach(x => list.Add(x.Value)); 
     return list; 
    } 
); 

とは?

+0

の幅広いセットに対してテストしていませんか? –

+0

私は結果リストのキーでdict.Valuesをソートします。 {1、 "a"}、{3、 "b"}、{2、 "c"}の場合、結果は{"a"、 "c"、b} 。 2番目の問題は、IEnumerableにValuesプロパティがないことです。 IDictionary のValuesプロパティにアクセスするにはどうすればよいですか? – zgabi

+0

辞書(Dictionary)オブジェクトがIDictionary(例えばNHibernateのPersistentGenericMap)でないため、IDictionary(非汎用)にキャストできません – zgabi

答えて

0

私が作品だと思いますが、その後、再び、私は `dict.Values`と間違って何inputs-

class ABC 
    { 
     public int MyProperty { get; set; } 
     public int MyProperty2 { get; set; } 
    } 
    static List<T> ConfigureMap<T>(Dictionary<int, T> input) where T : class 
    { 
     AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap(input.GetType(), typeof(List<T>)) 
     .ConstructUsing(Construct)); 

     return Mapper.Map<List<T>>(input); 

    } 

    private static object Construct(object arg1, ResolutionContext arg2) 
    { 
     if (arg1 != null) 
     { 
      var val = arg1 as IDictionary; 
      var argument = val.GetType().GetGenericArguments()[1]; 
      if (val != null) 
      { 
       var type = Activator.CreateInstance(typeof(List<>).MakeGenericType(argument)); 

       foreach (var key in val.Keys) 
       { 
        ((IList)type).Add(val[key]); 
       } 

       return type; 
      } 
     } 

     return null; 
    } 

var so = new Dictionary<int, ABC> { { 1, new ABC { MyProperty = 10, MyProperty2 = 30 } } }; 
var dest = new List<ABC>(); 
var res = ConfigureMap<ABC>(so); 
+0

この場合、ディクショナリエンティティはソートされず、この解決法は簡単ではありません。リフレクションとActivator.Creatinstanceはまだ必要です。私はこのソリューションは私のソリューションより複雑だと思う。 – zgabi

+0

別の問題は、私のオブジェクトがIDictionaryではなく、IDictionary であるため、 "val"は常にnullになります。私が使用できる唯一の非汎用ジェネリックインターフェイスは、IEnumerable – zgabi

関連する問題