2012-05-09 75 views
5

我有一個Dictionary<User, bool>AutoMapper字典壓扁

用戶如下:

public class User { 
    public string Username { get; set; } 
    public string Avatar { get; set; 
} 

第二種類型,布爾,表示該用戶是否登錄的用戶的朋友。 我想變平這個字典成List<UserDto> UserDto被定義爲:

public class UserDto { 
    public string Username { get; set; } 
    public string Avatar { get; set; } 
    public bool IsFriend { get; set; } 
} 

IsFriend表示字典的值。

我該怎麼做?

+0

如果任何人都可以給我一個實際使用automapper的方法,我會改變這個問題的答案! – reach4thelasers

回答

11

你應該能夠只用一個映射做到這一點:

你需要一個映射到KeyValuePair<User, bool>UserDto。這對於AutoMapper能夠將字典內容映射到我們最終創建的List<T>的內容而言是必需的(更多解釋請參見this answer)。

Mapper.CreateMap<KeyValuePair<User, bool>, UserDto>() 
    .ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.Key.UserName)) 
    .ForMember(dest => dest.Avatar, opt => opt.MapFrom(src => src.Key.Avatar)) 
    .ForMember(dest => dest.IsFriend, opt => opt.MapFrom(src => src.Value)); 

然後,使用映射在.Map電話:

Mapper.Map<Dictionary<User, bool>, List<UserDto>>(...); 

你並不需要映射集合本身,AutoMapper只要能處理映射DictionaryList爲你」 VE映射內容的集合,以彼此的(在我們的情況下,向KeyValuePair<User, bool>UserDto)。


編輯:這裏不需要映射另一種解決方案每User屬性UserDto

Mapper.CreateMap<User, UserDto>(); 
Mapper.CreateMap<KeyValuePair<User, bool>, UserDto>() 
    .ConstructUsing(src => Mapper.Map<User, UserDto>(src.Key)) 
    .ForMember(dest => dest.IsFriend, opt => opt.MapFrom(src => src.Value)); 

使用AutoMapper 2.0

+0

這個解決方案要求我隨時添加一個屬性到User&UserDto,我需要改變映射。我寧願有一個解決方案,不需要單獨的屬性進行映射。它不是自動映射器應該如何工作。 – reach4thelasers

+1

如果「這不是automapper應該如何工作」,那麼爲什麼API甚至提供'.ForMember'方法?不過,我會嘗試更「自動」的解決方案。 –

+1

@ reach4thelasers:我添加了另一個解決方案,我認爲可能會更加自動化 –

-1

簡單的東西就是這樣,一個快速的LINQ查詢就可以了。假設dict是你Dictionary<User,bool>

var conv = from kvp in dict 
      select new UserDto 
        { 
         Avatar = kvp.Key.Avatar, 
         IsFriend = kvp.Value, 
         Username = kvp.Key.Username 
        }; 
0

我知道我遲到了到遊戲,但這似乎是一個更通用的解決方案,將字典映射到.Net類型(si mple)使用automapper

public static IMappingExpression<Dictionary<string, string>, TDestination> ConvertFromDictionary<TDestination>(
     this IMappingExpression<Dictionary<string, string>, TDestination> exp) 
{ 
    foreach (PropertyInfo pi in typeof(TDestination).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) 
    { 
     exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r[propertyName])); 
    } 
    return exp; 
} 

使用方法如下

Mapper.CreateMap<Dictionary<string, string>, TDestination>().ConvertFromDictionary(); 

其中TDestination可以在.NET簡單類型。對於複雜的類型,你可以提供一個功能/ Action委託和地圖使用該功能。(裏面上面的for-each)

EG。

if (customPropNameMapFunc != null && !string.IsNullOrEmpty(customPropNameMapFunc(propertyName))) 
{ 
    exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r[customPropNameMapFunc(propertyName)])); 
}