首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C#自动映射器->条件映射

C#自动映射器->条件映射
EN

Stack Overflow用户
提问于 2018-07-31 14:54:54
回答 1查看 4.5K关注 0票数 1

我正在尝试做一些条件映射,我读过的所有文档和问题似乎都没有涵盖这个特定的条件。我希望这里的人能有经验,或者知道如何才是最好的方法。

我正在映射一个具有两个属性的对象。但是,如果某个特定属性具有值,则我不想映射这两个属性。要将其可视化,请执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach(var object in objectB) {
    If (object.propertyA == "SomeValue")
        continue;
    else
        Mapper.Map<ObjectA>(object);
}

但是,我想要上述语句的AutoMapper等效项。所以更像是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cfg.CreateMap<ObjectB, ObjectA>()
    .ForMember(dest => dest.PropertyA, m => m.Condition(source => source.PropertyA != "SomeValue"))
    .ForMember(dest => dest.PropertyB, m => m.Condition(source => source.PropertyA != "SomeVAlue" ? source.PropertyB : ignore))

但是上面的版本显然不起作用。提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-31 15:50:09

可以使用条件映射来实现,有关详细信息,请参阅文档(http://docs.automapper.org/en/latest/Conditional-mapping.html)。为了涵盖数组过滤的情况,我创建了一个自定义类型转换器,这有点棘手(参见http://docs.automapper.org/en/stable/Custom-type-converters.html)。更新后的示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using AutoMapper;
using System;
using System.Collections.Generic;

namespace ConsoleAppTest2
{
    class Program
    {
        static void Main(string[] args)
        {

            Mapper.Initialize(cfg => {
                //Using specific type converter for specific arrays
                cfg.CreateMap<Foo[], FooDto[]>().ConvertUsing(new ArrayFilterTypeConverter<Foo[], FooDto[], Foo, FooDto>(
                                                                                                               (src, dest) => (src.Age > 0)
                                                                                                            ));

                cfg.CreateMap<Foo, FooDto>()
                    .ForMember(dest => dest.Age, opt => opt.Condition(src => (src.Age >= 0)))
                    .ForMember(dest => dest.CurrentAddress, opt =>
                                                                {
                                                                    opt.Condition(src => (src.Age >= 0));
                                                                    opt.MapFrom(src => src.Address);
                                                                });

            });

            var foo = new Foo() { Name = "Name", Address = "Address", Age = -1 };
            var fooDTO = new FooDto();


            var fooArray = new Foo[] {
                    new Foo() { Name = "Name1", Address = "Address1", Age = -1 },
                    new Foo() { Name = "Name2", Address = "Address2", Age = 1 },
                    new Foo() { Name = "Name3", Address = "Address3", Age = 1 }
            };

            var fooDTOArray =  Mapper.Map<Foo[], FooDto[]>(fooArray); //get 2 elements instead of 3

            Mapper.Map(foo, fooDTO);
            //The result is we skipped Address and Age properties becase Age is negative

            Console.ReadLine();
        }
    }

    public class ArrayFilterTypeConverter<TSourceArray, TDestArray, TSource, TDest> : ITypeConverter<TSourceArray, TDestArray>
    {
        private Func<TSource, TDest, bool> filter;

        public ArrayFilterTypeConverter(Func<TSource, TDest, bool> filter)
        {
            this.filter = filter;
        }

        public TDestArray Convert(TSourceArray source, TDestArray destination, ResolutionContext context)
        {
            var sourceArray = source as TSource[];
            List<TDest> destList = new List<TDest>();

            var typeMap = context.ConfigurationProvider.ResolveTypeMap(typeof(TSource), typeof(TDest));

            foreach (var src in sourceArray)
            {
                var dest = context.Mapper.Map<TSource, TDest>(src);

                if (filter(src, dest))
                    destList.Add(dest);
            }

            // Little hack to cast array to TDestArray
            var result = (TDestArray)(object)destList.ToArray();
            return result;
        }
    }

    internal class FooDto
    {
        public string Name { get; set; }
        public string CurrentAddress { get; set; }
        public int Age { get; set; }

    }

    internal class Foo
    {
        public string Name { get; set; }
        public string Address { get; set; }

        public int Age { get; set; }
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51616335

复制
相关文章
模板基本使用
一、概述 模板是HTML页面,可以根据传递的数据进行填充 二、模板存放目录 在应用目录下创建名为templates目录来存放模板 在工程目录下创建名为templates目录来存放模板 三、将templates标记为模板文件夹 四、配置模板目录 目的 让工程知道哪个目录是存放模板的 配置 settings.py文件中的TEMPLATES字段 TEMPLATES = [ { <span class="hljs-string">'BACKEND'</span>: <span c
星哥玩云
2022/09/14
5250
模板基本使用
做logo的好工具 AAA_LOGO
今天要向您推荐的小工具是AAA_LOGO,这是一款制作LOGO的工具。它使用简单,素材、效果齐全、体积小巧、输出方便。
reizhi
2022/09/26
1.5K0
做logo的好工具 AAA_LOGO
flask jinja模板使用
from flask import Flask from flask import render_template app = Flask(name) @app.route('/') def index(): return render_template('index.html') @app.route('/user/<name>') def user(name): return render_template('user.html', name=name) if name == 'main'
用户5760343
2019/07/08
6000
模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板
图论 最短路 SPFA 1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 c
attack
2018/04/12
32.6K0
c++模板使用
模板特例化和模板重载函数可以共存,编译期针对不同的数据类型,生成多个版本的函数,c++11之后可以使用constexpr常量表达式,写编译期代码
sofu456
2022/05/10
7470
模板的基本使用
一、概述 模板是HTML页面,可以根据传递的数据进行填充 二、模板存放目录 在工程下创建templates模板目录进行模板文件的存放 三、将templates标记为模板文件夹 如果使用的pycharm进行工程的创建 则templates已经选好为Jinja2模板引擎 如果为手动创建工程 则需手动选择模板引擎 选择templates->Mark Directory as -> Template Folder 选择Template language -> Jinja2 -> ok 四、定义模板 inde
星哥玩云
2022/09/14
6660
模板的基本使用
注释代码使用模板
c/c++模板 /** * \brief Loads an item by name from this linker. * * \param linker the linker to load from * \param module the name of the module to get * \param name the name of the field to get * \param item where to store the extracted item * * \re
李小白是一只喵
2020/10/29
9860
Springboot使用velocity模板引擎第五章 使用velocity模板引擎
最爽的Web组合开发就是Intellij IDEA + Maven + Spring Boot + Scala + Velocity + Boostrap + jQuery了.
一个会写诗的程序员
2018/08/20
2.2K0
ArtTemplate模板的使用(二)
上一篇文章说了artTemplate的最基本的用法,它还有一个方法就是使用模板的方式,template的compile();
OECOM
2020/07/01
3890
使用nodejs填充word模板
这两天接到一个需求,需要批量生成wrod合同,合同中需要填充不同的信息,姓名,身份证号码,家庭住址,如果信息量比较少,手动填充比较快,但是合同有几百份,上面的信息不同,所以我们需要开发一个批量工具。
挥刀北上
2021/02/08
3.5K0
在模板中使用函数
系统自带的函数,一般在functions.php中 // C函数,获取配置名称 <title>{:C('WEB_SITE_TITLE')}</title> // U函数,获取URL地址 <a class="brand" href="{:U('index/index')}">OneThink</a>
PM吃瓜
2019/08/12
1.2K0
在模板中使用函数
Django-3 模板使用
在之前的文章中我们了解到模板允许我们在多个地方重用代码段,非常适合动态HTML页面。使用模板将更复杂的HTML返回给浏览器。我们还将看到如何将变量作为上下文传递给模板。接下来开始:
XXXX-user
2019/07/23
9890
Django-3 模板使用
使用thymeleaf生成mybatis模板
我们在使用mybatis做数据库访问的时候,有很多重复的东西要写,如DAO里面的增删改查,mapper/provider里面的各种东东,还有实体类,其实这些都是可以通过名称关联起来的,因此就有这么一个需求,去写一个工具类,根据模板去生成这些文件
微笑的小小刀
2019/07/30
1.1K0
artTemplate模板的使用(一)
artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,并且充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现。在 chrome 下渲染效率测试中分别是知名引擎 Mustache 与 micro tmpl 的 25 、 32 倍。
OECOM
2020/07/01
4710
用 Wolfram 语言模拟东京奥运会开幕式的无人机地球表演
迟到的 2020 年夏季奥运会开幕式于 2021 年 7 月 23 日在东京奥林匹克体育场举行。1824 架无人机在体育场上空以 3D 方式呈现东京奥运会会徽和之后拥有各大洲的地球。我尝试使用 Mathematica 重新创建这些球体。
WolframChina
2021/08/24
4250
用 Wolfram 语言模拟东京奥运会开幕式的无人机地球表演
springboot使用thymeleaf为模板
jsp已经明显跟不上时代发展了,freemarker用的够够的?换thymeleaf试试吧。springboot官方推荐的是freemarker和thymeleaf,而thymeleaf相对于freemarker更让人感觉强大的,是他可以动态替换标签内静态内容,这样前端可以安心写页面,后台可以安心撸接口,只需要把变量替换一下即可,这种理念,不知道是VUE抄袭了thymeleaf还是thymeleaf抄袭了VUE,不过无所谓了 ,对于我们广大码奴来说,实用就好
小尘哥
2018/08/15
5000
springboot使用thymeleaf为模板
网站建设模板怎么用 使用网站模板的好处
随着互联网的壮大,人们平时的生活已经无法离开网络,然而不同的网站也纷纷成立,无论是企业还是个人,都有了建立网站的需求,但做为新手来说,建设网站还是有一定困难的,所以不少人选择使用网站建设模板,可以减少很多在建网站时遇到的困难,下面就来看看,网站建设模板怎么用吧。
用户8715145
2021/10/20
6.2K0
Drools规则模板使用之Excel
原文链接:http://www.choupangxia.com/topic/detail/98
程序新视界
2022/05/09
1.3K0
SpringBoot 之 Web 使用 Thymeleaf 模板
SpringBoot 推荐使用 Thymeleaf,且默认不支持 JSP,因为 JSP 必须要打包war包才行。
AI码真香
2022/09/13
1.2K0
SpringBoot  之 Web 使用 Thymeleaf 模板
C++使用函数模板
第一次使用时,新的功能是创建。从功能模板生成的函数的实例称为模板或模板的实例。函数模板的开始是keywordtemplate,表示这是一个模板。
全栈程序员站长
2022/07/06
3990

相似问题

如何指定x和y轴绘制数据

31

如何绘制(x,y,z)

12

当x^2 + y^2 <1时,如何绘制f(x,y) = x/( 1 -y)?

21

如何绘制梯度(f(x,y))?

12

绘制结构化数据(x,y,value)

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文