前言: 今天在做二维码需求的时候,代码运行的时候报的:GDI+中发生一般性错误的解决办法这个错误,这个错误也是第一次遇到,不知道怎么解决,以为是生成二维码的代码错了。最后通过对代码的检查以及查资料进行解决了,原来是少了一个保存二维码图片的文件夹。 这个错误也常在在后台生成图片以及验证码中出现。基本上都是采用下面的几种解决办法 代码中没有物理的文件夹的解决办法: 在调用 Save 方法之前,先判断保存图片的文件夹是否存在,若不存在,则创建,当然也可以手动添加一个
1 2 3 4 |
//dirpath:文件路径 if (!Directory.Exists(dirpath)){ Directory.CreateDirectory(dirpath) } |
有保存图片的物理文件夹的解决办法: 给相应的文件夹赋予 NETWORK SERVICE 帐户以写权限 保存的文件已存在并因某种原因被锁定的解决办法: 重启IIS,解除锁定。并在代码中使用 using 语句,确保释放 Image 对象所使用的所有资源 ———————————————— 版权声明:本文为CSDN博主「小灰灰城堡」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/GreyCastle/article/details/88411697
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
使用POST方式可以向别的页面发送请求,并获取返回结果。 可以从一个页面发送POST到另一个页面,也可以在winform工程中使用HTTPRequest发送POST到一个页面。我们拿ASP.NET的aspx页面做个例子,从一个aspx页面POST.aspx ,发送请求到Receive.aspx页面。 1.首先,建立工程,添加两个页面,Post.aspx和Receive.aspx 在post页面中放一个BUTTON,在它的click方法中我们可以写这样的一段代码: private void Button1_Click(object sender, System.EventArgs e) { //XML文件路径 string xmlFileName = Server.MapPath("File/Frame.xml"); HttpWebRequest req = null; try { //设置要POST到的页面URL,这里中文参数或者有特殊符号的,要进行编码. string url = "http://localhost/Receive.aspx" + "?DwgFileName="+HttpUtility.UrlEncode("NNN+10111452505252706++2.bmp,NNN+10111457375757706++13.bmp")+ "&PltFileName="+HttpUtility.UrlEncode("NNN+10110934363434706++主页.JPG"); //创建一个HttpWebRequest对象 req = (HttpWebRequest) HttpWebRequest.Create(url); //设置它提交数据的方式post req.Method = "POST"; //设置 Content-type HTTP 标头的值 req.ContentType = "text/xml";// "application/x-www-form-urlencoded;charset=gb2312"; using (StreamWriter requestWriter = new StreamWriter(req.GetRequestStream())) { //定义一个StreamReader对象,用于读取xml文件的内容 StreamReader reader = new StreamReader(xmlFileName); string ret = reader.ReadToEnd(); reader.Close(); requestWriter.WriteLine(ret);//将读取的内容写入到RequestStream中。 } Response.Write("发出去了"); } catch(Exception ex) { throw ex; } finally{ } } 2. 再来看一下接收页面Receive.aspx 在Receive.aspx页面的PageLoad方法中进行接收POST过来的请求。 private void Page_Load(object sender, System.EventArgs e) { if(Request.RequestType == "POST") { //Response.ContentType = "text/xml"; string pltFileName = Request.QueryString["PltFileName"];//PLT文件名 string dwgFileName = Request.QueryString["DwgFileName"];//dwg文件名列表 :111.dwg,222.dwg,333.dwg..... //接收并读取POST过来的XML文件流 StreamReader reader = new StreamReader(Request.InputStream); String xmlData = reader.ReadToEnd(); try { //声明一个XMLDoc文档对象,LOAD()xml字符串 XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlData); //得到XML文档根节点 XmlElement root = doc.DocumentElement; .....进行自己对XML的操作。。。 } |
from:https://www.cnblogs.com/shenyixin/p/4630698.html
View Details本文一些资料参考自https://blog.csdn.net/sinat_27657511/article/details/52275327,感谢这位博主 下面就来谈下StringComparison。 public enum StringComparison { CurrentCulture, CurrentCultureIgnoreCase, InvariantCulture, InvariantCultureIgnoreCase, Ordinal, OrdinalIgnoreCase } CurrentCulture 使用区域敏感排序规则和当前区域比较字符串。 CurrentCultureIgnoreCase 使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。 InvariantCulture 使用区域敏感排序规则和固定区域比较字符串。 InvariantCultureIgnoreCase 使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。 Ordinal 使用序号排序规则比较字符串。 OrdinalIgnoreCase 使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。 StringComparison.Ordinal 在进行调用String.Compare(string1,string2,StringComparison.Ordinal)的时候是进行非语言(non-linguistic)上的比较,API运行时将会对两个字符串进行byte级别的比较,因此这种比较是比较严格和准确的,并且在性能上也很好,一般通过StringComparison.Ordinal来进行比较比使用String.Compare(string1,string2)来比较要快10倍左右.(可以写一个简单的小程序验证,这个挺让我惊讶,因为平时使用String.Compare从来就没想过那么多).StringComparison.OrdinalIgnoreCase就是忽略大小写的比较,同样是byte级别的比较.性能稍弱于StringComparison.Ordinal. string类型中的Contains函数默认使用了Ordinal方式,所以速度会很快 其他的方法例如IndexOf,CompareTo等都默认使用了CurrentCulture方式,所以速度会相对比较满,可以调用的时候显示声明StringComparison的方式,速度会快很多,下面是测试: 在约1500个字符中查找一个字符‘q’,位于该序列的结尾处。 使用Ordinal方式的速度: 不使用Ordinal方式: 对比发现速度确实快了很多,在文本约庞大时候,效果会更加的明显。 from:https://blog.csdn.net/w199753/article/details/83421165
View Details“Authentication to host ‘localhost’ for user ‘root’ using method ‘mysql_native_password’ failed with message: Reading from the stream has failed” 昨天晚上,因为某些原因,几天没打开的C#.net winform项目调试时突然启动失败,冒出来这个提示。 说实话,因为没抓着重点,我昨晚基本上就浪费了,虽然我猜到了是连接超时之类的原因,可一直没明白究竟是我弄错了什么,才会连接不上MySQL数据库 今天再找原因的时候,就Get到重点了:“Reading from the stream has failed”,这个是数据库返回的报错信息 搜索了一下,看到一个文章,说是从MySQL5.7以后,就增加了SSL连接验证功能,这个功能就可能导致上面这个报错,关掉它的话,连接速度能变快 尽管根据了解到的资料,SSL这个校验应该不会影响到使用 Localhost(本地)方式连接的才对,但还是死马当活马医,在ado.net连接字符串里加上了“SslMode=None;” 结果是成功的,确实不再报错,连接上了 再回过头来想想,我这两天也没对MySQL做过什么设置更改啊,仅有的操作,就是配置了一下ODBC数据源,怎么会突然间就出现这毛病呢? 不知道有没有大佬了解的,求科普 ———————————————— 版权声明:本文为CSDN博主「某店长」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/jdjdjdjdjdjd/article/details/89068331
View Details转自:https://blog.csdn.net/kongwei521/article/details/54927689 在项目开发过程中,估计也有人和我遇到过同样的经历:运行环境出现了重大Bug亟需解决、或者由于电脑挂了、旧代码覆盖新代码,而在这种情况下,我们不能直接在当前的代码中修改这个Bug然后发布,这会导致更严重的问题,因为相当于版本回退了。还有电脑挂了代码整个都没有,这种情况下 我们只能只能利用一些逆向的技巧和工具了 来解析在服务器发布好的dll。那么你只是单纯的修改一个.Net程序集中的某个方法或功能,而且这个程序集还是出自于你自己或你所在团队之手,这实在是一件非常容易的事情,这和破解别人的程序完全不同,你不会遇到无法破解的加密算法,也不会遇到让人恶心的加壳混淆。所以我要把用过的工具一个个的列出来总结一下。 推荐四大发编译工具 1:.Net Reflector 【收费】 一提起.Net逆向,其实很多人第一反应都是Reflector这款神器,这一方面是由于Reflector良好的用户体验和强大的插件功能,另一方面要归功于Reflector堪称完美的智能反编译能力,使用它不仅能看到反编译后的IL源码甚至能直接反编译出C#源码,而且和编写时的代码几无二致,如果需要还可以直接另存为工程文件用Visual Studio打开,不过现在已经收费了,所以老司机都选择破解版,有钱人选择正版。 破解地址就不在这里放出,大家自行搜索. 使用方法:可以直接把dll、exe拖放到左侧,或者文件选择选择 官方网址:http://www.red-gate.com/products/dotnet-development/reflector/ 2:ILSpy/dnSpy 【免费】 ILSpy是唯一免费且开源的.NET反编译器,它基于MIT许可证发布。ILSpy的代码生成和语法高亮功能做的非常好。对于反编译的程序集,它既可以将其保存在一个文件中,也可以为所有文件创建一个项目。ILSpy是一个独立的工具,没有Visual Studio集成。,ILSpy 是为了完全替代收费的Reflector而生,它是由 iCSharpCode 团队出品,这个团队开发了著名的 SharpDevelop 。ILSpy 完全开源,ILSpy的使用和上面的Reflector完全类似,可以直接把dll、exe拖放到左侧,或者文件选择选择。 官方网址:http://ilspy.net/ ILSPY还有一款同门师弟,感觉比ILSPY还强大 dnSpy is a .NET assembly editor, decompiler, and debugger forked from ILSpy * Assembly editor * Decompiler * Debugger * Tabs and tab groups * Themes (blue, dark, light and high contrast) If you want to help, fork the project and send pull requests. Latest release: https://github.com/0xd4d/dnSpy/releases Latest build: https://ci.appveyor.com/project/0xd4d/dnspy/build/artifacts 3:JetBrains dotPeek【免费】 JetBrains是捷克的一家软件开发公司,出品了大量著名的开发工具,包括:IntelliJ IDEA、PHPStorm、ReSharper、TeamCity、YouTrack等等,每一款产品都如雷贯耳。dotPeek 是 JetBrains 开发的一款.Net反编译工具,是.Net工具套件中的一个相比于前面几款工具来说,dotPeek算比较小众的一款,它生成的代码质量很高,它还会尝试到源代码服务器上抓取代码。DotPeek的导航功能和快捷键非常便捷。它还能精确查找符号的使用,同时支持插件。DotPeek不能与Visual Studio集成。个人感觉它最大的特色就是Visual Studio风格,这对于那些长期在Visual Studio下进行开发的人来说应该更亲切一点。 官方网址:http://www.jetbrains.com/decompiler/ 4:Telerik JustDecompile 【需要输入信息安装】不喜欢这个就卸载了 Telerik JustDecompile是一个免费的.NET反编译器,但是有商业化支持。它生成的代码质量也很高。它可以为反编译程序集得到的代码创建一个项目。JustDecompile提供了健壮的查找功能,能够支持全文查找和符号使用查找。它还有一个插件系统,目前在Telerik的网站上有两个可用的扩展。JustDecompile不能与Visual Studio集成。 […]
View Details
1 |
wsdl /language:c# /n:JSRMYY /out:c:/WebServiceForAutoOrder.cs http://{url}/hisOrderReal/WebServiceForAutoOrder.asmx?WSDL |
公司一老哥提供的方法,避免生成一大堆文件~ wsdl.exe下载
View Details核心代码return (T)(object)xxx; 示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
public static T GetUnitSettingById<T>(int id) where T : Setting { if (typeof(T).Equals(typeof(BodySetting))) { var body = BodySetting_table.Instance.GetEntityByPrimaryKey(id); if (body!=null) { return (T)(object)body; } } return null; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/// <summary> /// 从DataRow里获取指定字段的值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="row"></param> /// <param name="columnName"></param> /// <returns></returns> private T GetValue<T>(DataRow row, string columnName) { var resultObj = new object(); switch (typeof(T).Name.ToLower()) { case "int32": var numInt = 0; if (row.Table.Columns.Contains(columnName)) int.TryParse(row.Field<string>(columnName), out numInt); resultObj = numInt; break; case "int64": var numLong = 0l; if (row.Table.Columns.Contains(columnName)) long.TryParse(row.Field<string>(columnName), out numLong); resultObj = numLong; break; case "decimal": var numDecimal = 0m; if (row.Table.Columns.Contains(columnName)) decimal.TryParse(row.Field<string>(columnName), out numDecimal); resultObj = numDecimal; break; case "string": resultObj = row.Table.Columns.Contains(columnName) ? row.Field<string>(columnName) : string.Empty; break; case "datetime": var outDatetime = new DateTime(); if (row.Table.Columns.Contains(columnName)) DateTime.TryParse(row.Field<string>(columnName), out outDatetime); resultObj = outDatetime; break; } return (T)resultObj; } |
参考:https://blog.csdn.net/iningwei/article/details/88978598
View Details光子:最常见的原因是权限的问题,比如你的log目录没有写入权限,有时可能还要给“完全控制”的权限。 ============================================================================ log4net不输出日志文件主要有以下几个原因: 1 没有在AssemblyInfo文件中添加下面的代码:
1 |
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] |
2 运行程序目录下没有log4net.config配置文件。 解决方法有两种: 手动将log4net.config复制到运行程序 选择解决方案中的log4net.config,在属性–>复制到输出目录,选择始终复制。 3 运行程序目录下没有log4net.dll文件。 解决方案: 手动复制,一般不会出现。 4 log4net的net framework版本与运行程序的版本不一致。 如果在调试中出现以下提示:
1 2 3 4 5 |
引发的异常:“log4net.Appender.FileAppender.LockingStream.LockStateException”(位于 log4net.dll 中) 引发的异常:“System.InvalidOperationException”(位于 System.dll 中) 引发的异常:“System.IO.PathTooLongException”(位于 mscorlib.dll 中) 引发的异常:“System.IO.PathTooLongException”(位于 mscorlib.dll 中) 引发的异常:“log4net.Appender.FileAppender.LockingStream.LockStateException”(位于 log4net.dll 中) |
就很有可能是这个原因。 解决方案: 更改log4net版本或者运行程序的net framework版本。 5 log4net.config的配置文件中有错误。 解决方案: 这个问题最难解决,因为你必须要仔细检查每一个设置点。例如我有一次就无法输出日志,最后发现,file节点配置如下:
1 |
<file value="\\Log\\Common\\"/> |
更改为
1 |
<file value="Log\\Common\\"/> |
期待的日志就出现了。因此,如果前面确定都没有问题的话,你就应该仔细检查一下你的配置文件了。 from:https://blog.csdn.net/sgmcumt/article/details/83021616
View Details转自:https://blog.csdn.net/kongwei521/article/details/54927689 在项目开发过程中,估计也有人和我遇到过同样的经历:运行环境出现了重大Bug亟需解决、或者由于电脑挂了、旧代码覆盖新代码,而在这种情况下,我们不能直接在当前的代码中修改这个Bug然后发布,这会导致更严重的问题,因为相当于版本回退了。还有电脑挂了代码整个都没有,这种情况下 我们只能只能利用一些逆向的技巧和工具了 来解析在服务器发布好的dll。那么你只是单纯的修改一个.Net程序集中的某个方法或功能,而且这个程序集还是出自于你自己或你所在团队之手,这实在是一件非常容易的事情,这和破解别人的程序完全不同,你不会遇到无法破解的加密算法,也不会遇到让人恶心的加壳混淆。所以我要把用过的工具一个个的列出来总结一下。 推荐四大发编译工具 1:.Net Reflector 【收费】 一提起.Net逆向,其实很多人第一反应都是Reflector这款神器,这一方面是由于Reflector良好的用户体验和强大的插件功能,另一方面要归功于Reflector堪称完美的智能反编译能力,使用它不仅能看到反编译后的IL源码甚至能直接反编译出C#源码,而且和编写时的代码几无二致,如果需要还可以直接另存为工程文件用Visual Studio打开,不过现在已经收费了,所以老司机都选择破解版,有钱人选择正版。 破解地址就不在这里放出,大家自行搜索. 使用方法:可以直接把dll、exe拖放到左侧,或者文件选择选择 官方网址:http://www.red-gate.com/products/dotnet-development/reflector/ 2:ILSpy/dnSpy 【免费】 ILSpy是唯一免费且开源的.NET反编译器,它基于MIT许可证发布。ILSpy的代码生成和语法高亮功能做的非常好。对于反编译的程序集,它既可以将其保存在一个文件中,也可以为所有文件创建一个项目。ILSpy是一个独立的工具,没有Visual Studio集成。,ILSpy 是为了完全替代收费的Reflector而生,它是由 iCSharpCode 团队出品,这个团队开发了著名的 SharpDevelop 。ILSpy 完全开源,ILSpy的使用和上面的Reflector完全类似,可以直接把dll、exe拖放到左侧,或者文件选择选择。 官方网址:http://ilspy.net/ ILSPY还有一款同门师弟,感觉比ILSPY还强大 dnSpy is a .NET assembly editor, decompiler, and debugger forked from ILSpy * Assembly editor * Decompiler * Debugger * Tabs and tab groups * Themes (blue, dark, light and high contrast) If you want to help, fork the project and send pull requests. Latest release: https://github.com/0xd4d/dnSpy/releases Latest build: https://ci.appveyor.com/project/0xd4d/dnspy/build/artifacts 3:JetBrains dotPeek【免费】 JetBrains是捷克的一家软件开发公司,出品了大量著名的开发工具,包括:IntelliJ IDEA、PHPStorm、ReSharper、TeamCity、YouTrack等等,每一款产品都如雷贯耳。dotPeek 是 JetBrains 开发的一款.Net反编译工具,是.Net工具套件中的一个相比于前面几款工具来说,dotPeek算比较小众的一款,它生成的代码质量很高,它还会尝试到源代码服务器上抓取代码。DotPeek的导航功能和快捷键非常便捷。它还能精确查找符号的使用,同时支持插件。DotPeek不能与Visual Studio集成。个人感觉它最大的特色就是Visual Studio风格,这对于那些长期在Visual Studio下进行开发的人来说应该更亲切一点。 官方网址:http://www.jetbrains.com/decompiler/ 4:Telerik JustDecompile 【需要输入信息安装】不喜欢这个就卸载了 Telerik JustDecompile是一个免费的.NET反编译器,但是有商业化支持。它生成的代码质量也很高。它可以为反编译程序集得到的代码创建一个项目。JustDecompile提供了健壮的查找功能,能够支持全文查找和符号使用查找。它还有一个插件系统,目前在Telerik的网站上有两个可用的扩展。JustDecompile不能与Visual Studio集成。 […]
View Details一.什么是AutoMapper与为什么用它。 它是一种对象与对象之间的映射器,让AutoMapper有意思的就是在于它提供了一些将类型A映射到类型B这种无聊的实例,只要B遵循AutoMapper已经建立的惯例,那么大多数情况下就可以进行相互映射了。 二.如何使用? 直接nuget install-package automapper 简单到不能再简单了。 三.入门 定义了连个简单的Model:
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Destination { public string name { get; set; } public string InfoUrl { get; set; } } public class Source { public string name { get; set; } public string InfoUrl { get; set; } public string aa { get; set; } } |
1 2 3 4 5 6 7 8 9 10 11 |
static void Main(string[] args) { Destination des = new Destination() { InfoUrl = "www.cnblogs.com/zaranet", name = "张子浩" }; Mapper.Initialize(x => x.CreateMap<Destination, Source>()); Source source = AutoMapper.Mapper.Map<Source>(des); Console.WriteLine(source.InfoUrl); } |
Initialize方法是Mapper的初始化,里面可以写上CreateMap表达式,具体是谁和谁进行匹配。在之后就可以直接进行一个获取值的过程了,非常的简单。 四.映射前后操作 偶尔有的时候你可能需要在映射的过程中,你需要执行一些逻辑,这是非常常见的事情,所以AutoMapper给我们提供了BeforeMap和AfterMap两个函数。
1 2 3 |
Mapper.Initialize(x => x.CreateMap<Destination, Source>().BeforeMap( (src,dest)=>src.InfoUrl ="https://"+src.InfoUrl).AfterMap( (src,dest)=>src.name="真棒"+src.name)); |
其中呢,src是Destination对象,dest是Source,你呢就可以用这两个对象去获取里面的值,说白了这就是循环去找里面的值了。 五.条件映射
1 |
Mapper.Initialize(x => x.CreateMap<Destination, Source>().ForMember(dest => dest.InfoUrl,opt => opt.Condition(dest => dest.InfoUrl == "www.cnblogs.com/zaranet1")).ForMember(...(.ForMember(...)))); |
在条件映射中,通过ForMember函数,参数是一个委托类型Fun<>,其里面呢也是可以进行嵌套的,但一般来说一个就够用了。 六.AutoMapper配置 初始化配置是非常受欢迎的,每个领域都应该配置一次。
1 2 3 4 5 |
//初始化配置文件 Mapper.Initialize(cfg => { cfg.CreateMap<Aliens, Person>(); }); |
但是像这种情况呢,如果是多个映射,那么我们只能用Profile来配置,组织你的映射配置,并将配置放置到构造函数中(这种情况是5.x以上的版本),一个是以下的版本,已经被淘汰了。 5.0及以上版本:
1 2 3 4 5 6 7 |
public class AliensPersonProfile : Profile { public AliensPersonProfile() { CreateMap<Destination, Source>(); } } |
5.0以下版本(在早期版本中,使用配置方法而不是构造函数。 从版本5开始,Configure()已经过时。 它将在6.0中被删除。)
1 2 3 4 5 6 7 |
public class OrganizationProfile : Profile { protected override void Configure() { CreateMap<Foo, FooDto>(); } } |
然后在程序启动的时候初始化即可。
1 |
Mapper.Initialize(x=>x.AddProfile<AliensPersonProfile>()); |
七.AutoMapper的最佳实践 上文中已经说到了AutoMapper的简单映射,但是在实际项目中,我们应该有很多类进行映射,这么多的映射应该怎么组织,这是一个活生生的问题,这成为主映射器。 在主映射器中,组织了多个小映射器,Configuration为我们的静态配置入口类;Profiles文件夹为我们所有Profile类的文件夹。如果是MVC,我们需要在Global中调用,那我的这个是控制台的。
1 2 3 4 5 6 7 8 |
public static void Configure() { Mapper.Initialize(cfg => { cfg.AddProfile<DestinationSourceProfile>(); cfg.AddProfile(new StudentSourceProfile()); }); } |
其中添加子映射,可以用以上两种方式。
1 2 3 4 |
public void Configuration(IAppBuilder app) { AutoMapperConfiguration.Configure(); } |
八.指定映射字段 在实际业务环境中,你不可能说两个类的字段是一 一 对应的,这个时候我们就要对应它们的映射关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class CalendarEvent { public DateTime Date { get; set; } public string Title { get; set; } } public class CalendarEventForm { public DateTime EventDate { get; set; } public int EventHour { get; set; } public int EventMinute { get; set; } public string DisplayTitle { get; set; } } |
在这两个类中,CalendarEvent的Date将被拆分为CalendarEventForm的日期、时、分三个字段,Title也将对应DisplayTitle字段,那么相应的Profile定义如下:
1 2 3 4 5 6 7 8 9 10 11 |
public class CalendarEventProfile : Profile { public CalendarEventProfile() { CreateMap<CalendarEvent, CalendarEventForm>() .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date)) .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour)) .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute)) .ForMember(dest => dest.DisplayTitle, opt => opt.MapFrom(src => src.Title)); } } |
main方法通过依赖注入,开始映射过程,下图是代码和图。
1 2 3 4 5 6 7 8 9 10 11 |
static void Main(string[] args) { CalendarEvent calendar = new CalendarEvent() { Date = DateTime.Now, Title = "Demo Event" }; AutoMapperConfiguration.Configure(); CalendarEventForm calendarEventForm = Mapper.Map<CalendarEventForm>(calendar); Console.WriteLine(calendarEventForm); } |
那么最后呢,如果是反向的映射,一定回缺少属性,那么就你就可以obj.属性进行赋值。 附AutoHelper封装类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
/// <summary> /// AutoMapper扩展帮助类 /// </summary> public static class AutoMapperHelper { /// <summary> /// 类型映射 /// </summary> public static T MapTo<T>(this object obj) { if (obj == null) return default(T); Mapper.CreateMap(obj.GetType(), typeof(T)); return Mapper.Map<T>(obj); } /// <summary> /// 集合列表类型映射 /// </summary> public static List<TDestination> MapToList<TDestination>(this IEnumerable source) { foreach (var first in source) { var type = first.GetType(); Mapper.CreateMap(type, typeof(TDestination)); break; } return Mapper.Map<List<TDestination>>(source); } /// <summary> /// 集合列表类型映射 /// </summary> public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source) { //IEnumerable<T> 类型需要创建元素的映射 Mapper.CreateMap<TSource, TDestination>(); return Mapper.Map<List<TDestination>>(source); } /// <summary> /// 类型映射 /// </summary> public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination) where TSource : class where TDestination : class { if (source == null) return destination; Mapper.CreateMap<TSource, TDestination>(); return Mapper.Map(source, destination); } /// <summary> /// DataReader映射 /// </summary> public static IEnumerable<T> DataReaderMapTo<T>(this IDataReader reader) { Mapper.Reset(); Mapper.CreateMap<IDataReader, IEnumerable<T>>(); return Mapper.Map<IDataReader, IEnumerable<T>>(reader); } } |
from:https://www.cnblogs.com/ZaraNet/p/10000311.html
View Details