編輯:這原本是1:1映射,但我想通了,我需要一個更復雜的遞歸映射,這樣一個新的問題被張貼在這裏:How to recursively map entity to view model with Automapper function call?如何自動將.NET函數調用映射到屬性?
我想一般映射實體類功能到視圖模型,使用ServiceStack ConvertTo <>方法。這映射所有相似的類型和屬性名稱,並且工作正常,但我想找到一種方法將函數的結果映射到屬性。下面是一些代碼
實體例如:
public class Item {
public long Id {get; set;}
public List<Product> GetProducts() {
return Repository.GetAll<Product>();
}
}
視圖模型例如:
public class ItemViewModel {
public long Id {get;set;}
public List<Product> Products {get; set;}
}
理想的結果將是有一個地圖功能,着眼於實體類的匹配方法返回類型,函數名稱是「Get」+屬性名稱,然後執行它並將結果映射到視圖模型。
public TTarget MapToViewModel<TSource, TTarget>(TSource source)
where TTarget : new()
{
var sourceType = source.GetType();
var targetProperties = typeof(TTarget).GetProperties(BindingFlags.Public | BindingFlags.Instance);
var sourceProperties = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
var sourceMethods = sourceType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
var target = Activator.CreateInstance<TTarget>();
foreach (var prop in targetProperties)
{
var sourceProp = sourceProperties.FirstOrDefault(x => x.Name == prop.Name);
if (sourceProp != null)
{
prop.SetValue(target, sourceProp.GetValue(source, null), null);
}
else
{
var sourceMethod = sourceMethods.FirstOrDefault(x => x.Name == "Get" + prop.Name);
if (sourceMethod != null)
{
prop.SetValue(target, sourceMethod.Invoke(source, null), null);
}
}
}
return target;
}
在上面的.FirstOrDefault
調用的條件:
謝謝,我得到了這個工作。現在我有另一個困境。做這個遞歸有多難?例如,如果Product類有一個屬性List圖像,我需要從Product類調用GetImages()? –
user3092978
我真的沒有看到這將需要一個遞歸調用。你的意思是,如果方法和屬性都存在於一個對象上,那麼該方法需要調用?如果是這樣的話,你可以切換屬性和方法的if語句來首先檢查方法。 – valverij
不完全,我的意思是如果映射對象具有需要通過調用另一個函數來映射的另一個屬性。你的回答幫助我確定我需要一些更復雜的東西,看起來像Automapper可能能夠處理。我問另一個問題在這裏http://stackoverflow.com/questions/20573600/how-to-recursively-map-entity-to-view-model-with-automapper-function-call – user3092978