2015-11-20 47 views
-1

嗨有我有這些源和目標類,並在映射ICollection SomeClasses {get; set}屬性卡住。我簡化了它們,但實際的類很複雜。如何使用反射映射集合屬性

public class Source 
    { 
     public string Name{get; set;} 
     public ICollection<SomeClass> SomeClasses {get;set} 
    } 

    public class Result 
    { 
     public string Name{get; set;} 
     public ICollection<SomeClass> SomeClasses {get;set} 
    } 

    public class SomeClass 
    { 
     public string Name {get; set;} 
     public string SomeThing {get;set} 
    } 

這是我玩的代碼,沒有運氣。

public object Map(object source, object result) 
     {   
      foreach (PropertyInfo item in source.GetType().GetRuntimeProperties()) 
      { 
       if (item.PropertyType.IsGenericType && item.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) != null) 
       { 
        Type type = item.PropertyType.GetGenericArguments()[0]; 
        var innerObj = FormatterServices.GetUninitializedObject(type); 

        var listType = typeof(List<>); 
        var constructedListType = listType.MakeGenericType(innerObj.GetType()); 

        var newList = (IList)Activator.CreateInstance(constructedListType); 

        IEnumerable listValue = (IEnumerable)item.GetValue(source); 

        IEnumerable listValue = (IEnumerable)item.GetValue(source); 

        //newList.Add(innerObj); 
        //item.SetValue(source, newList); 

        foreach (var val in listValue) 
        { 
         newList.Add(val); 
        } 

        //list.Add(obj4); 
        //option a 
        //result.GetType().GetRuntimeProperty(item.Name).SetValue(result, newList); 

    //option b 
    result.GetType().GetRuntimeProperty(item.Name).SetValue(result, item.GetValue(source)); 

       } 
      } 
     } 
+3

有一個名爲AutoMapper的庫可以完成這個工作。你看過嗎? – PoweredByOrange

+0

你到底在掙扎什麼?你遇到什麼錯誤?針對您遇到的特定問題添加更多精確度將會產生更多更好的答案 – Louis

+0

@PoweredByOrange感謝您的建議。 AutoMapper是偉大的,但這需要我對屬性名稱進行如此多的更改,這對我來說是不可行的,因爲我將不得不經歷大約5000條代碼行。在這裏寫下自己的25行是很棒的。 – Raider

回答

0

選項a)在更改了我已經定義了類SomeClass的命名空間後爲我工作。實際上,SomeClass已經被定義在不同的命名空間下,並且我選擇了錯誤的命名空間。