1

私はこれらのモデルを持っているとしましょう

   public class Mouse
    {
        public string Cheese { get; set; }
    }

    public class Cat
    {
        public string Hairball { get; set; }
    }

    public class Dog
    {
        public string ChewyToy { get; set; }
    }

そして、マウスを猫にマップし、次に猫を犬にマップします。

    Mapper.CreateMap<Mouse, Cat>().ForMember(m => m.Hairball, o => o.MapFrom(src => src.Cheese));
    Mapper.CreateMap<Cat, Dog>().ForMember(m => m.ChewyToy, o => o.MapFrom(src => src.Hairball));

ひいては、マウスも犬にマッピングする必要がありますよね?2つの間でマップしようとすると:

    var mouse = new Mouse() { Cheese = "Eat me" };

    Dog dog = Mapper.Map<Mouse, Dog>(mouse);

例外が発生します:

App_Start.MapConfig+MouseをApp_Start.MapConfig+Dogにマップしようとしています。タイプ「AutoMapper.AutoMapperMappingException」の例外がスローされました。

マウスと犬の間にマップを明示的に作成せずにこれを行うにはどうすればよいですか?これは、より大きな問題の簡単な例です。また、Value Injector、Glueなどのフレームワークがこの動作をサポートしている場合は、それらを切り替えることもできます。

4

1 に答える 1

0

マウスと犬の間にマップを明示的に作成せずにこれを行うにはどうすればよいですか?

答えは簡単です:あなたはできません

Automapperには、オブジェクトをマッピングするための非常に単純なロジックがあります。新しいマッピングを追加する場合:

Mapper.CreateMap<Mouse, Cat>();

新規TypeMapが作成され、タイプマップのリストに追加されます。はい、簡単なリストがあります。そして、それぞれTypeMapに2つのプロパティがあります:DestinationTypeSourceType。真ん中には何もありません。オブジェクトをマッピングしようとすると、マッピングで指定されているのとまったく同じソースと宛先のタイプTypeMapを持つリストが最初に検索されます。これは次のメソッドで実行されます(ConfigurationStoreクラスは構成されたマッピングを保持する責任があります)。

TypeMap FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType)
{
    return this._typeMaps.FirstOrDefault<TypeMap>(x => 
               ((x.DestinationType == destinationType) && 
                (x.SourceType == sourceType)));
}

したがって、サンプルの場合TypeMap、リストには2つのオブジェクトがあり、もちろん、それらのいずれもがに等しいおよび等しいの条件に一致DestinationTypeDogませSourceTypeMouse

于 2013-03-25T15:00:22.147 に答える