<div id="content_views" class="markdown_views"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <h2 id="实体类与实体dto类之间的转换"><a name="t0"></a>实体类与实体DTO类之间的转换</h2>前端
<p></p><div class="toc"><div class="toc"> <ul> <li><ul> <li><a href="#实体类与实体dto类之间的转换" rel="nofollow" target="_self">实体类与实体DTO类之间的转换</a><ul> <li><a href="#1经过使用第三方序列化反序列化工具newtonsoftjson" rel="nofollow" target="_self">1.经过使用第三方序列化反序列化工具Newtonsoft.Json</a></li> <li><a href="#2经过反射实现" rel="nofollow" target="_self">2.经过反射实现</a></li> <li><a href="#3经过表达式目录树加字典缓存实现" rel="nofollow" target="_self">3.经过表达式目录树加字典缓存实现</a></li> <li><a href="#4-经过表达式目录树加泛型缓存实现静态构造函数" rel="nofollow" target="_self">4. 经过表达式目录树加泛型缓存实现(静态构造函数)</a></li> </ul> </li> </ul> </li> </ul> </div> </div> <p></p>web
<h3 id="1经过使用第三方序列化反序列化工具newtonsoftjson"><a name="t1"></a>1.经过使用第三方序列化反序列化工具Newtonsoft.Json</h3>json
<p>经过Nuget包管理器添加Newtonsoft.Json <br> <img src="https://img-blog.csdn.net/20180520214411143?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NTkxNjcx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" title=""> <br> 构造一个Trans的静态方法:</p>缓存
<pre class="prettyprint" name="code"><code class="hljs cs has-numbering" onclick="mdcp.signin(event)"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> TOut Trans<TIn,TOut>(TIn tIn) { <span class="hljs-keyword">return</span> JsonConvert.DeserializeObject<TOut>(JsonConvert.SerializeObject(tIn)); } <div class="hljs-button signin" data-title="登陆后复制"></div></code></pre>markdown
<p>前端调用:</p>app
<pre class="prettyprint" name="code"><code class="hljs vbscript has-numbering" onclick="mdcp.signin(event)">People people = <span class="hljs-keyword">new</span> People { Id = <span class="hljs-number">1</span>, Name = <span class="hljs-string">"ddd"</span>, <span class="hljs-keyword">Class</span> = <span class="hljs-number">1</span> }; PeopleCopy peopleCopy = SerializeMapper.Trans<People, PeopleCopy>(people); <div class="hljs-button signin" data-title="登陆后复制"></div></code></pre>svg
<h3 id="2经过反射实现"><a name="t2"></a>2.经过反射实现</h3>函数
<p>构造一个Trans的静态方法:</p>工具
<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering" onclick="mdcp.signin(event)">public static TOut Trans<TIn,TOut>(TIn tIn) { TOut tOut = Activator<span class="hljs-preprocessor">.CreateInstance</span><TOut>()<span class="hljs-comment">; </span> foreach (var outfield <span class="hljs-keyword">in</span> tOut<span class="hljs-preprocessor">.GetType</span>()<span class="hljs-preprocessor">.GetFields</span>()) { foreach (var infield <span class="hljs-keyword">in</span> tIn<span class="hljs-preprocessor">.GetType</span>()<span class="hljs-preprocessor">.GetFields</span>()) { if (outfield<span class="hljs-preprocessor">.Name</span><span class="hljs-preprocessor">.Equals</span>(infield<span class="hljs-preprocessor">.Name</span>)) { outfield<span class="hljs-preprocessor">.SetValue</span>(tOut, infield<span class="hljs-preprocessor">.GetValue</span>(tIn))<span class="hljs-comment">;</span> <span class="hljs-keyword">break</span><span class="hljs-comment">;</span> } } } foreach (var outProperty <span class="hljs-keyword">in</span> tOut<span class="hljs-preprocessor">.GetType</span>()<span class="hljs-preprocessor">.GetProperties</span>()) { foreach (var inProperty <span class="hljs-keyword">in</span> tIn<span class="hljs-preprocessor">.GetType</span>()<span class="hljs-preprocessor">.GetProperties</span>()) { if (outProperty<span class="hljs-preprocessor">.Name</span><span class="hljs-preprocessor">.Equals</span>(inProperty<span class="hljs-preprocessor">.Name</span>)) { outProperty<span class="hljs-preprocessor">.SetValue</span>(tOut,inProperty<span class="hljs-preprocessor">.GetValue</span>(tIn))<span class="hljs-comment">;</span> <span class="hljs-keyword">break</span><span class="hljs-comment">;</span> } } } return tOut<span class="hljs-comment">;</span> } <div class="hljs-button signin" data-title="登陆后复制"></div></code></pre>url
<p>前端调用:</p>
<pre class="prettyprint" name="code"><code class="hljs vbscript has-numbering" onclick="mdcp.signin(event)">People people = <span class="hljs-keyword">new</span> People { Id = <span class="hljs-number">1</span>, Name = <span class="hljs-string">"ddd"</span>, <span class="hljs-keyword">Class</span> = <span class="hljs-number">1</span> }; PeopleCopy peopleCopy = ReflectionMapper.Trans<People, PeopleCopy>(people); <div class="hljs-button signin" data-title="登陆后复制"></div></code></pre>
<h3 id="3经过表达式目录树加字典缓存实现"><a name="t3"></a>3.经过表达式目录树加字典缓存实现</h3>
<p>静态字典:</p>
<pre class="prettyprint" name="code"><code class="hljs cs has-numbering" onclick="mdcp.signin(event)"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Dictionary<<span class="hljs-keyword">string</span>, Object> _Dictionary = <span class="hljs-keyword">new</span> Dictionary<<span class="hljs-keyword">string</span>, <span class="hljs-keyword">object</span>>();<div class="hljs-button signin" data-title="登陆后复制"></div></code></pre>
<p>构造一个Trans的静态方法:</p>
<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering" onclick="mdcp.signin(event)">public static TOut Trans<TIn, TOut>(TIn tIn) { TOut tOut = Activator<span class="hljs-preprocessor">.CreateInstance</span><TOut>()<span class="hljs-comment">;</span> string key = string<span class="hljs-preprocessor">.Format</span>(<span class="hljs-string">"funckey_{0}_{1}"</span>, tIn<span class="hljs-preprocessor">.GetType</span>()<span class="hljs-preprocessor">.Name</span>, tOut<span class="hljs-preprocessor">.GetType</span>()<span class="hljs-preprocessor">.Name</span>)<span class="hljs-comment">;</span> if (!_Dictionary<span class="hljs-preprocessor">.ContainsKey</span>(key)) { ParameterExpression parameterExpression = Expression<span class="hljs-preprocessor">.Parameter</span>(typeof(TIn), <span class="hljs-string">"p"</span>)<span class="hljs-comment">;</span> List<MemberBinding> memberBindingsList = new List<MemberBinding>()<span class="hljs-comment">;</span> foreach (var item <span class="hljs-keyword">in</span> typeof(TOut)<span class="hljs-preprocessor">.GetProperties</span>()) { MemberExpression property = Expression<span class="hljs-preprocessor">.Property</span>(parameterExpression, typeof(TIn)<span class="hljs-preprocessor">.GetProperty</span>(item<span class="hljs-preprocessor">.Name</span>))<span class="hljs-comment">;</span> MemberBinding memberBinding = Expression<span class="hljs-preprocessor">.Bind</span>(item, property)<span class="hljs-comment">;</span> memberBindingsList<span class="hljs-preprocessor">.Add</span>(memberBinding)<span class="hljs-comment">;</span> } foreach (var item <span class="hljs-keyword">in</span> typeof(TOut)<span class="hljs-preprocessor">.GetFields</span>()) { MemberExpression filed = Expression<span class="hljs-preprocessor">.Field</span>(parameterExpression, typeof(TIn)<span class="hljs-preprocessor">.GetField</span>(item<span class="hljs-preprocessor">.Name</span>))<span class="hljs-comment">;</span> MemberBinding memberBinding = Expression<span class="hljs-preprocessor">.Bind</span>(item, filed)<span class="hljs-comment">;</span> memberBindingsList<span class="hljs-preprocessor">.Add</span>(memberBinding)<span class="hljs-comment">;</span> } MemberInitExpression memberInitExpression = Expression<span class="hljs-preprocessor">.MemberInit</span>(Expression<span class="hljs-preprocessor">.New</span>(typeof(TOut)), memberBindingsList<span class="hljs-preprocessor">.ToArray</span>())<span class="hljs-comment">;</span> Expression<Func<TIn, TOut>> lambda = Expression<span class="hljs-preprocessor">.Lambda</span><Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[] { parameterExpression })<span class="hljs-comment">;</span> Func<TIn, TOut> func = lambda<span class="hljs-preprocessor">.Compile</span>()<span class="hljs-comment">;</span> _Dictionary[key] = func<span class="hljs-comment">;</span> } return ((Func<TIn, TOut>)_Dictionary[key])<span class="hljs-preprocessor">.Invoke</span>(tIn)<span class="hljs-comment">;</span> } <div class="hljs-button signin" data-title="登陆后复制"></div></code></pre>
<p>前端调用:</p>
<pre class="prettyprint" name="code"><code class="hljs vbscript has-numbering" onclick="mdcp.signin(event)">People people = <span class="hljs-keyword">new</span> People { Id = <span class="hljs-number">1</span>, Name = <span class="hljs-string">"ddd"</span>, <span class="hljs-keyword">Class</span> = <span class="hljs-number">1</span> }; PeopleCopy peopleCopy = ExpressionMapper.Trans<People, PeopleCopy>(people); <div class="hljs-button signin" data-title="登陆后复制"></div></code></pre>
<h3 id="4-经过表达式目录树加泛型缓存实现静态构造函数"><a name="t4"></a>4. 经过表达式目录树加泛型缓存实现(静态构造函数)</h3>
<p>构造一个泛型缓存类:</p>
<pre class="prettyprint" name="code"><code class="hljs cs has-numbering" onclick="mdcp.signin(event)"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> ExpressionGenericMapper<TIn,TOut> { <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Func<TIn, TOut> _FUNC = <span class="hljs-keyword">null</span>; <span class="hljs-keyword">static</span> ExpressionGenericMapper() { ParameterExpression parameterExpression = Expression.Parameter(<span class="hljs-keyword">typeof</span>(TIn),<span class="hljs-string">"p"</span>); List<MemberBinding> memberBindingsList = <span class="hljs-keyword">new</span> List<MemberBinding>(); <span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">var</span> item <span class="hljs-keyword">in</span> <span class="hljs-keyword">typeof</span>(TOut).GetProperties()) { MemberExpression property = Expression.Property(parameterExpression, <span class="hljs-keyword">typeof</span>(TIn).GetProperty(item.Name)); MemberBinding memberBinding = Expression.Bind(item, property); memberBindingsList.Add(memberBinding); } <span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">var</span> item <span class="hljs-keyword">in</span> <span class="hljs-keyword">typeof</span>(TOut).GetFields()) { MemberExpression property = Expression.Field(parameterExpression, <span class="hljs-keyword">typeof</span>(TIn).GetField(item.Name)); MemberBinding memberBinding = Expression.Bind(item, property); memberBindingsList.Add(memberBinding); } MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(<span class="hljs-keyword">typeof</span>(TOut)), memberBindingsList.ToArray()); Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, <span class="hljs-keyword">new</span> ParameterExpression[] { parameterExpression }); _FUNC = lambda.Compile();<span class="hljs-comment">//拼装是一次性的</span> } <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> TOut <span class="hljs-title">Trans</span>(TIn tIn) { <span class="hljs-keyword">return</span> _FUNC(tIn); } } <div class="hljs-button signin" data-title="登陆后复制"></div></code></pre>
<p>前端调用:</p>
<pre class="prettyprint" name="code"><code class="hljs vbscript has-numbering" onclick="mdcp.signin(event)">People people = <span class="hljs-keyword">new</span> People { Id = <span class="hljs-number">1</span>, Name = <span class="hljs-string">"ddd"</span>, <span class="hljs-keyword">Class</span> = <span class="hljs-number">1</span> }; PeopleCopy peopleCopy = ExpressionGenericMapper.Trans<People, PeopleCopy>(people);<div class="hljs-button signin" data-title="登陆后复制"></div></code></pre> </div>
原文地址:https://blog.csdn.net/m0_37591671/article/details/80386122