-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));
}
}
}
有一個名爲AutoMapper的庫可以完成這個工作。你看過嗎? – PoweredByOrange
你到底在掙扎什麼?你遇到什麼錯誤?針對您遇到的特定問題添加更多精確度將會產生更多更好的答案 – Louis
@PoweredByOrange感謝您的建議。 AutoMapper是偉大的,但這需要我對屬性名稱進行如此多的更改,這對我來說是不可行的,因爲我將不得不經歷大約5000條代碼行。在這裏寫下自己的25行是很棒的。 – Raider