2012-06-25 52 views
27

我有以下型號:使用AutoMapper一個對象的屬性映射到一個字符串

public class Tag 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

我希望能夠使用AutoMapper到Tag類型的Name屬性映射到一個字符串屬性我的一個視角模型。

我創建了一個自定義的解析器試圖處理這種映射,使用下面的代碼:

public class TagToStringResolver : ValueResolver<Tag, string> 
    { 
     protected override string ResolveCore(Tag source) 
     { 
      return source.Name ?? string.Empty; 
     } 
    } 

我使用下面的代碼映射:

Mapper.CreateMap<Tag, String>() 
    .ForMember(d => d, o => o.ResolveUsing<TagToStringResolver>()); 

當我運行的應用程序,我得到錯誤:

Custom configuration for members is only supported for top-level individual members on a type.

我在做什麼錯?

回答

40

這是因爲你正試圖映射到實際的目標類型,而不是目標類型的屬性。你可以實現你想要的東西:

Mapper.CreateMap<Tag, string>().ConvertUsing(source => source.Name ?? string.Empty); 

雖然它會更簡單很多,只是要覆蓋Tag類的ToString。

+0

謝謝Rob。我結束了與您的建議只是覆蓋Tag類的ToString。 – marcusstarnes

+0

謝謝你。出於天真,我在使用'ConvertUsing()'時使用'ForMember()'。 –

9

ForMember表示您爲要在類型之間進行映射的成員提供映射。相反,使用這樣的:

Mapper.CreateMap<Tag, String>().ConvertUsing<TagToStringConverter>(); 

器和轉換器是

public class TagToStringConverter : ITypeConverter<Tag, String> 
{ 
    public string Convert(ResolutionContext context) 
    { 
     return (context.SourceValue as Tag).Name ?? string.Empty; 
    } 
} 
+0

這幫助我映射整個實體。我必須將ViewModel映射到實體,這是要走的路,謝謝! – jpgrassi

+0

非常好的功能,thx帕特里克! –

相關問題