2011-09-17 8 views
6

私はjsonコンバータをロールしていますが、マッピング指定で修飾されたプロパティがあります。私はリフレクションを使用して、そのマッピング記述を使用して、どのような種類のオブジェクトを作成し、どのようにマップするかを決定しています。下記の問題は、私は「プロパティのリスト型にリストを変換傾けることである例である私は、コレクションに到達するまで...リスト<object>リストへ<T>反射を使用して

[JsonMapping("location", JsonMapping.MappingType.Class)] 
    public Model.Location Location { get; set; } 

私のマッピングが正常に動作します...

[JsonMapping("images", JsonMapping.MappingType.Collection)] 
    public IList<Image> Images { get; set; } 

private static List<object> Map(Type t, JArray json) { 

     List<object> result = new List<object>(); 
     var type = t.GetGenericArguments()[0]; 

     foreach (var j in json) { 
      result.Add(Map(type, (JObject)j)); 
     } 

     return result; 
    } 

これは私にリストを返しますが、反射はプロパティを実行する前にIConvertableを実装したいと考えています。値。

誰かがこれを行うより良い方法を知っていますか?

+0

はおそらく違いはありませんが、しかし、あなたはIListの代わりに(またはその逆)への地図の戻り値の型を変更しようとしましたか? –

+0

これを実行するには、IList 'の逆変数サポートが必要です。 C#はそれを持っていないので、 'IList list = new List (); ' – Andreas

+0

を割り当てることができません。タイプをIList に変更できますが、IList のタイプ人々が図書館を利用するとき、物事はきちんとマップされているということです。 –

答えて

2

あなたはType.MakeGenericTypeを使用して正しいタイプのListオブジェクト作成できます

private static IList Map(Type t, JArray json) 
{ 
    var elementType = t.GetGenericArguments()[0]; 

    // This will produce List<Image> or whatever the original element type is 
    var listType = typeof(List<>).MakeGenericType(elementType); 
    var result = (IList)Activator.CreateInstance(listType); 

    foreach (var j in json) 
     result.Add(Map(type, (JObject)j)); 

    return result;  
} 
+0

それはそうです!完璧な実装。どうもありがとう。 –

関連する問題