實體類與實體DTO類之間的轉換

<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&lt;TIn,TOut&gt;(TIn tIn) { <span class="hljs-keyword">return</span> JsonConvert.DeserializeObject&lt;TOut&gt;(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&lt;People, PeopleCopy&gt;(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&lt;TIn,TOut&gt;(TIn tIn) { TOut tOut = Activator<span class="hljs-preprocessor">.CreateInstance</span>&lt;TOut&gt;()<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&lt;People, PeopleCopy&gt;(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&lt;<span class="hljs-keyword">string</span>, Object&gt; _Dictionary = <span class="hljs-keyword">new</span> Dictionary&lt;<span class="hljs-keyword">string</span>, <span class="hljs-keyword">object</span>&gt;();<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&lt;TIn, TOut&gt;(TIn tIn) { TOut tOut = Activator<span class="hljs-preprocessor">.CreateInstance</span>&lt;TOut&gt;()<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&lt;MemberBinding&gt; memberBindingsList = new List&lt;MemberBinding&gt;()<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&lt;Func&lt;TIn, TOut&gt;&gt; lambda = Expression<span class="hljs-preprocessor">.Lambda</span>&lt;Func&lt;TIn, TOut&gt;&gt;(memberInitExpression, new ParameterExpression[] { parameterExpression })<span class="hljs-comment">;</span> Func&lt;TIn, TOut&gt; func = lambda<span class="hljs-preprocessor">.Compile</span>()<span class="hljs-comment">;</span> _Dictionary[key] = func<span class="hljs-comment">;</span> } return ((Func&lt;TIn, TOut&gt;)_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&lt;People, PeopleCopy&gt;(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&lt;TIn,TOut&gt; { <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Func&lt;TIn, TOut&gt; _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&lt;MemberBinding&gt; memberBindingsList = <span class="hljs-keyword">new</span> List&lt;MemberBinding&gt;(); <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&lt;Func&lt;TIn, TOut&gt;&gt; lambda = Expression.Lambda&lt;Func&lt;TIn, TOut&gt;&gt;(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&lt;People, PeopleCopy&gt;(people);<div class="hljs-button signin" data-title="登陸後複製"></div></code></pre> </div>

原文地址:https://blog.csdn.net/m0_37591671/article/details/80386122

相關文章
相關標籤/搜索