2011-09-17 13 views
6

Toczę konwerter json i mam właściwości ozdobione oznaczeniem mapowania. Używam refleksji, aby użyć tego opisu odwzorowania, aby określić rodzaj obiektu do utworzenia i sposób jego mapowania. Poniżej znajduje się przykład ...Listę <object> Listę <T> za pomocą refleksji

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

Moje mapowanie działa dobrze, dopóki nie dostać się do kolekcji ...

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

Problemem jest to, że nie mogę do konwersji listy do typu listy nieruchomości .

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

która zwraca mi listy, ale odbicie chce mi wdrożyć IConvertable przed wykonaniem property.SetValue.

Ktoś wie lepszy sposób na zrobienie tego?

+0

Prawdopodobnie nie robi różnicy, ale czy próbował zmienić typ zwracany mapy do IList zamiast (lub odwrotnie)? –

+0

Do tego celu potrzebne jest wsparcie kontrawariancji dla 'IList '. C# nie ma tego, więc nie możesz przypisać 'IList list = new List ();' – Andreas

+0

Mogę zmienić typ na IList , ale chcę, aby był to typ IList lub jakikolwiek określony przeze mnie tak że kiedy ludzie korzystają z biblioteki, rzeczy są dla nich starannie zmapowane. –

Odpowiedz

2

Można by stworzyć List przedmiot odpowiedniego typu używając Type.MakeGenericType:

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

To prawda! Perfekcyjna realizacja. Wielkie dzięki. –

Powiązane problemy