2011-09-17 18 views
6

Estoy haciendo rodar un convertidor json y tengo propiedades decoradas con una designación de mapeo. Estoy usando la reflexión para usar esa descripción de mapeo para determinar qué tipo de objeto crear y cómo se mapea. A continuación se muestra un ejemplo ...Lista <object> En la lista <T> usando la reflexión

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

Mi mapeo funciona bien hasta que llegue a una colección ...

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

El problema es que no puede convertir al tipo de lista lista de los bienes .

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

Esto me devuelve la lista, pero la reflexión quiere que implemento IConvertable antes de hacer una property.SetValue.

¿Alguien sabe de una mejor manera de hacer esto?

+0

Probablemente no hace una diferencia, pero ¿ha intentado cambiar el tipo de retorno de Mapa de IList lugar (o viceversa)? –

+0

Necesitará soporte de contravarianza para 'IList ' para poder hacer eso. C# no tiene eso así que no puedes asignar 'IList list = new List ();' – Andreas

+0

Bueno, podría cambiar el tipo a IList , pero quiero que sea del tipo IList o cualquier tipo que especifique que cuando las personas usan la biblioteca, las cosas están perfectamente mapeadas para ellos. –

Respuesta

2

Se puede crear List objeto del tipo correcto utilizando 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

¡Eso lo hace! Implementación perfecta. Muchas gracias. –

Cuestiones relacionadas