<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