2011-09-17 79 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; 
    } 

返回列表,但反射想讓我在做一個property.SetValue之前實現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

就是這樣!完美的實施。非常感謝。 –

相關問題