1. ホーム
  2. .net

[解決済み】AutoMapper: "残りを無視する"?

2022-04-06 03:16:35

質問

AutoMapper に、明示的にマッピングされたプロパティ以外を無視するように指示する方法はありますか。

外部から変更される可能性のある外部DTOクラスがあり、新しいプロパティを追加すると、自分のオブジェクトにマッピングしようとしたときに機能が壊れる(例外が発生する)ので、明示的に無視するプロパティをそれぞれ指定するのは避けたいのです。

どのように解決するのですか?

これは、私が書いた、宛先に存在しないすべてのプロパティを無視する拡張メソッドです。この質問は2年以上前のものなので、まだ役に立つかどうかわかりませんが、私は多くの手動Ignoreコールを追加しなければならない同じ問題に遭遇しました。

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>
(this IMappingExpression<TSource, TDestination> expression)
{
    var flags = BindingFlags.Public | BindingFlags.Instance;
    var sourceType = typeof (TSource);
    var destinationProperties = typeof (TDestination).GetProperties(flags);

    foreach (var property in destinationProperties)
    {
        if (sourceType.GetProperty(property.Name, flags) == null)
        {
            expression.ForMember(property.Name, opt => opt.Ignore());
        }
    }
    return expression;
}

使用方法

Mapper.CreateMap<SourceType, DestinationType>()
                .IgnoreAllNonExisting();

アップデイト : どうやら、カスタムマッピングがある場合は上書きされてしまうため、正しく動作しないようです。IgnoreAllNonExistingを先に呼んで、カスタムマッピングを後で呼ぶようにすれば、まだ動くと思います。

schdrは(この質問に対する回答として)解決策を用意しており、それは Mapper.GetAllTypeMaps() を使用して、マッピングされていないプロパティを見つけ、それらを自動的に無視します。私にはより堅牢なソリューションのように思えます。