2012-05-09 12 views
5

मुझे मिल गया है एक Dictionary<User, bool>AutoMapper शब्दकोश सपाट

उपयोगकर्ता इस प्रकार है:

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

दूसरे प्रकार bool, बताता है कि यह उपयोगकर्ता उपयोगकर्ता में लॉग इन के एक दोस्त है या नहीं।

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

IsFriend शब्दकोश का मान: के रूप में मैं एक List<UserDto में इस शब्दकोश समतल करना चाहते हैं> UserDto परिभाषित किया गया है।

मैं यह कैसे कर सकता हूं?

+0

यदि कोई मुझे वास्तव में ऑटोमैपर का उपयोग करने वाली विधि दे सकता है, तो मैं इस सवाल पर जवाब बदलूंगा! – reach4thelasers

उत्तर

11

आप सिर्फ एक मानचित्रण के साथ ऐसा करने में सक्षम होना चाहिए:

आप एक KeyValuePair<User, bool>UserDto करने के लिए नक्शे की जरूरत है। ऑटोमैपर 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 Dictionary एक List से मैप जब तक आप के रूप में संभाल कर सकते हैं, संग्रह के लिए खुद को मैप करने की आवश्यकता नहीं है ' हमने एक दूसरे के संग्रह के सामग्री मैप किया है (हमारे मामले में, 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

इस समाधान के लिए आवश्यक है कि जब भी मैं उपयोगकर्ता और उपयोगकर्ता को कोई संपत्ति जोड़ूं तो मुझे मानचित्रण को बदलने की आवश्यकता है। मेरे पास एक ऐसा समाधान होगा जिसके लिए व्यक्तिगत गुणों को मैप किए जाने की आवश्यकता नहीं है। ऐसा नहीं है कि कैसे automapper काम करना चाहिए। – reach4thelasers

+1

यदि "यह नहीं है कि ऑटोमैपर को कैसे काम करना है" तो एपीआई भी 'FORMember' विधि' क्यों प्रदान करती है? फिर भी, मैं एक और अधिक "स्वचालित" समाधान का प्रयास करूंगा। –

+1

@ access4thelasers: मैंने एक और समाधान जोड़ा है जो मुझे लगता है कि थोड़ा और अधिक स्वैच्छिक हो सकता है –

-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

मैं जानता हूँ कि मैं देर से कर रहा हूँ का उपयोग करना खेल के लिए, फिर भी यह एक शब्दकोश को मैप करने के लिए एक सामान्य सामान्य समाधान प्रतीत होता है। नेट प्रकार (सी 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 सरल प्रकार है जैसे कि यह प्रयोग करें। जटिल प्रकारों के लिए, आप उस फ़ंक्शन का उपयोग करके एक Func/action प्रतिनिधि और मानचित्र प्रदान कर सकते हैं। (प्रत्येक के लिए उपरोक्त के अंदर)

उदाहरण।

if (customPropNameMapFunc != null && !string.IsNullOrEmpty(customPropNameMapFunc(propertyName))) 
{ 
    exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r[customPropNameMapFunc(propertyName)])); 
} 
संबंधित मुद्दे