using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
People p = new People() { Age = 28, name = new Name() { FirstName = "zheng", LastName = "zhiqiang" } };
PeopleDto pDto = new PeopleDto();
pDto = AutoMapping<People, PeopleDto>.Convert(p, pDto);
Console.WriteLine(string.Format("{0} {1} {2}", pDto.Age, pDto.FirstName, pDto.LastName));
Console.Read();
}
}
/// <summary>
///
/// </summary>
/// <typeparam name="T1">entity</typeparam>
/// <typeparam name="T2">dto</typeparam>
public static class AutoMapping<T1, T2>
where T1 : new()
where T2 : new()
{
public static T2 Convert(T1 t1, T2 t2)
{
var dtoPiList = t2.GetType().GetProperties().Where(x => x.PropertyType.IsPublic).ToList();
string name;
object value;
for (int i = 0; i < dtoPiList.Count(); i++)
{
name = dtoPiList[i].Name;
value = GetPropertyValue(t1, name);
if (null == value) continue;
dtoPiList[i].SetValue(t2, value, null);
}
return t2;
}
private static object GetPropertyValue(object t1, string name)
{
Type t = t1.GetType();
PropertyInfo[] pis = t.GetProperties();
//查找当前对象是否包含需要转换的属性
var piTemp = pis.Where(x => x.Name == name).FirstOrDefault();
//不存在递归查询
if (piTemp == null)
{
foreach (PropertyInfo pi in pis)
{
object obj1 = pi.GetValue(t1, null);
object obj2 = GetPropertyValue(obj1, name);
if (obj2 != null) { return obj2; }
}
}
else
{
//判断是否忽略标记
var cAttr = piTemp.GetCustomAttributes();
foreach (var attr in cAttr)
{
var tempAttr = attr as AutoMappingAttributes;
if (tempAttr.Ignore) { return null; }
}
//存在直接返回
return piTemp.GetValue(t1, null);
}
return null;
}
}
public class AutoMappingAttributes : Attribute
{
public bool Ignore { get; set; }
}
public class Name
{
public string FirstName { get; set; }
[AutoMappingAttributes(Ignore = true)]
public string LastName { get; set; }
} public class People
{
public int Age { get; set; }
public Name name { get; set; } }
public class NameDto
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class PeopleDto
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
} }

  

自己写的AutoMapper的更多相关文章

  1. 说说ABP项目中的AutoMapper,Castle Windsor(痛并快乐着)

    这篇博客要说的东西跟ABP,AutoMapper和Castle Windsor都有关系,而且也是我在项目中遇到的问题,最终解决了,现在的感受就是“痛并快乐着”. 首先,这篇博客不是讲什么新的知识点,而 ...

  2. Asp.net Core 2.2关于AutoMapper更初级的入门教程

    今天刚看到老张的哲学博客关于AutoMapper的教程,从壹开始前后端分离[ .NET Core2.0 +Vue2.0 ]框架之十三 || DTOs 对象映射使用,项目部署Windows+Linux完 ...

  3. 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统

    一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...

  4. 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper

    剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...

  5. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  6. 【AutoMapper官方文档】DTO与Domin Model相互转换(中)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  7. 【AutoMapper官方文档】DTO与Domin Model相互转换(下)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  8. 【道德经】漫谈实体、对象、DTO及AutoMapper的使用

    写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的DTO AutoMapper实体转换 后记 实体(Entity).对象(Object).DTO(Dat ...

  9. AutoMapper(三)

    返回总目录 自定义类型转换 有时,需要完全控制一个类型到另一个类型的转换.一个类型一点都不像另一个类型,而且转换函数已经存在了,在这种情况下,你想要从一个“宽松”的类型转换成一个更强壮的类型,例如一个 ...

随机推荐

  1. 修改Excel2013默认模版(启动模版和新建Sheet模版)

    1.  C:\Windows\ShellNew\EXCEL12.XLSX 设置好格式后另存为, 然后复制过来覆盖掉,如果覆盖不了,注意修改所有者权限 2. 新建文件保存为模版文件Sheet.xltx, ...

  2. centos6.7设置非root帐户自动登录

    1.在/etc/gdm/custom.conf文件中修改并加入以下这段 [daemon]AutomaticLogin=你的用户名AutomaticLoginEnable=True 2.重启 reboo ...

  3. python gutter area / 设置断点、行号右边代码左边的空白栏

    最后通过在设置里搜索 关键词:show 找到的.== Edito > General > Gutter Icons Show gutter icons

  4. WP8.1 RT 生命周期详解‏‏‏‏‏‏‏‏‏‏‏‏‏

                应用状态关系转换图 根据此“应用状态关系转换图”.有以下: 三个状态: NotRunning:未运行    Running:运行中   Suspended:挂起 三个事件: A ...

  5. Mac Pro 资源管理器 Double Commander“个性化设置” 备份

    操作系统自带的资源管理器,总是有些别扭的地方,在 Windows 系统下,我一般用 Total Commander(破解版)来作为替代品.现在换为 Mac 系统,自带的 Finer 也不怎么好用,连最 ...

  6. 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  7. Apache Rewrite匹配问号的问题

    在写RewriteRule准备匹配url中的问号及后面的参数时,怎么弄都无法成功.正则的写法经过测试是正确的,问号也已经转义\?,可还是不行. 百度查询了下,RewriteRule 不会去匹配问号?后 ...

  8. PYTHON 函数的动态参数

    #普通参数示例 def func(args): print(args) func(123456) #执行结果为123456 如果给多个参数,就会报错 #动态参数示例 def func(*args): ...

  9. python基础六

    模块 1.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 包:用来从逻辑上 ...

  10. 进度条ProgressDialog

    1.效果图 public void click(View view) { final ProgressDialog pdDialog = new ProgressDialog(this); //设置标 ...