2012-02-20 22 views

答えて

3

@dtryon's answerのオフピギーバック、これについてタフな部分は、あなたのDTOタイプにNameValueCollectionで内部オブジェクトをマッピングする方法はありませんということです。

あなたができることは、NameValueCollectionのアイテムからKeyValuePair<string, string>オブジェクトを構成するcustom converterオブジェクトを作成することです。これにより、KeyValuePairから別のマッピングを利用して、目的のタイプの汎用コンバータを作成することができます。ような何か:

Mapper.CreateMap<KeyValuePair<string, string>, MetaModel>() 
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Key)) 
    .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Value)); 

そして最後に、カスタムコンバータを使用して、NameValueCollectionList<MetaModel>との間のマッピングを作成します:

public class NameValueCollectionConverter<T> : ITypeConverter<NameValueCollection, List<T>> 
{ 
    public List<T> Convert(ResolutionContext ctx) 
    { 
     NameValueCollection source = ctx.SourceValue as NameValueCollection; 

     return source.Cast<string>() 
      .Select (v => MapKeyValuePair(new KeyValuePair<string, string>(v, source[v]))) 
      .ToList(); 
    } 

    private T MapKeyValuePair(KeyValuePair<string, string> source) 
    { 
     return Mapper.Map<KeyValuePair<string, string>, T>(source); 
    } 
} 

次にあなたがMetaModelKeyValuePair<string, string>からのマッピングを定義する必要があります

Mapper.CreateMap<NameValueCollection, List<MetaModel>>() 
    .ConvertUsing<NameValueCollectionConverter<MetaModel>>(); 
1

まあ、私はこれを行うには良い方法があるとは思いません。これは主に、NameValueCollection内のキー/値オブジェクトのハンドルを取得できないためです。幸いにもList<MetaModel>にマップするコードはそれほど悪くありません。私はちょうどそれを手動でマッピングし、作業を続ける:

[TestMethod] 
    public void TestMethod2() 
    { 
     List<MetaModel> dest = new List<MetaModel>(); 
     NameValueCollection src = new NameValueCollection(); 

     src.Add("Key1", "Value1"); 
     src.Add("Key2", "Value2"); 
     src.Add("Key3", "Value3"); 
     src.Add("Key4", "Value4"); 
     src.Add("Key5", "Value5"); 

     foreach (var srcItem in src.AllKeys) 
     { 
      dest.Add(new MetaModel() { Name = srcItem, Value = src[srcItem] }); 
     } 

     Assert.AreEqual(5, dest.Count); 

    } 
+0

+1、これをカスタムリゾルバでラップして、もう少し再利用できるようにすることができます。 –

+0

あなたはそれをしますか? –

関連する問題