6

私は持っていますDictionary<User, bool>

ユーザーは次のとおりです。

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

2 番目のタイプの bool は、このユーザーがログインしているユーザーの友人であるかどうかを示します。このディクショナリをフラット化したいList<UserDto> UserDto は次のように定義されています。

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

IsFriendディクショナリの値を表します。

これどうやってするの?

4

3 に答える 3

14

1 つのマッピングだけでこれを実行できるはずです1 :

KeyValuePair<User, bool>を にマッピングする必要がありますUserDto。これは、AutoMapper がディクショナリのコンテンツを、List<T>最終的に作成する のコンテンツにマップできるようにするために必要です (詳細については、この回答を参照してください)。

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から へのマップを処理できるためです。ListKeyValuePair<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));

1 AutoMapper 2.0 の使用

于 2012-05-15T12:14:07.277 に答える
0

私はゲームに遅れていることを知っていますが、これはオートマッパーを使用して辞書を.Netタイプ(シンプル)にマッピングするためのより一般的なソリューションのようです

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 デリゲートとマップを指定できます (上記の for-each 内)。

例えば。

if (customPropNameMapFunc != null && !string.IsNullOrEmpty(customPropNameMapFunc(propertyName)))
{
   exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r[customPropNameMapFunc(propertyName)]));
}
于 2014-03-18T15:57:23.650 に答える
-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
                    };
于 2012-05-09T16:08:43.283 に答える