C# Common utils

来源:https://www.cnblogs.com/sam-snow-v/archive/2019/02/18/10395322.html
-Advertisement-
Play Games

對象深拷貝 計算最大公約數 數組與結構體相互轉換 字元串與char數組、byte數組轉換 Windows消息處理 字元串編碼轉換 通過反射獲取對象所有屬性集合,以鍵值對形式展現 實體類轉SQL條件字元串 待續 ...


對象深拷貝

 1 /// <summary>
 2 /// 深度克隆對象
 3 /// </summary>
 4 /// <typeparam name="T">待克隆類型(必須由[Serializable]修飾)</typeparam>
 5 /// <param name="obj">待克隆對象</param>
 6 /// <returns>新對象</returns>
 7 public static T Clone<T>(T obj)
 8 {
 9     T ret = default(T);
10     if (obj != null)
11     {
12         XmlSerializer cloner = new XmlSerializer(typeof(T));
13         MemoryStream stream = new MemoryStream();
14         cloner.Serialize(stream, obj);
15         stream.Seek(0, SeekOrigin.Begin);
16         ret = (T)cloner.Deserialize(stream);
17     }
18     return ret;
19 }
20 /// <summary>
21 /// 克隆對象
22 /// </summary>
23 /// <param name="obj">待克隆對象(必須由[Serializable]修飾)</param>
24 /// <returns>新對象</returns>
25 public static object CloneObject(object obj)
26 {
27     using (MemoryStream memStream = new MemoryStream())
28     {
29         BinaryFormatter binaryFormatter = new BinaryFormatter(null,new StreamingContext(StreamingContextStates.Clone));
30         binaryFormatter.Serialize(memStream, obj);
31         memStream.Seek(0, SeekOrigin.Begin);
32         return binaryFormatter.Deserialize(memStream);
33     }
34 }

 計算最大公約數

 1 /// <summary>
 2 /// 計算最大公約數
 3 /// </summary>
 4 /// <param name="a">數值A</param>
 5 /// <param name="b">數值B</param>
 6 /// <returns>最大公約數</returns>
 7 private static ulong GCD(ulong a, ulong b)
 8 {
 9     return b == 0 ? a : GCD(b, a % b);
10 }

 數組與結構體相互轉換

 1 /// <summary>
 2 /// UDS報文結構體(示例)
 3 /// </summary>
 4 [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
 5 public struct StdUDSMsg
 6 {
 7     public byte DL;
 8     public byte SID;
 9     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
10     public byte[] DID;
11     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
12     public byte[] Data;
13 }
14 /// <summary>
15 /// byte 數組轉結構體
16 /// </summary>
17 /// <typeparam name="T">結構體對象類型</typeparam>
18 /// <param name="bytes">byte 數組</param>
19 /// <returns>結構體對象</returns>
20 public T ByteArrayToStructure<T>(byte[] bytes) where T : struct
21 {
22     T stuff = new T();
23     GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
24     try
25     {
26         stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
27     } finally
28     {
29         handle.Free();
30     }
31     return stuff;
32 }
33 /// <summary>
34 /// 結構體對象轉 Byte 數組
35 /// </summary>
36 /// <typeparam name="T">結構體對象類型</typeparam>
37 /// <param name="stuff">結構體對象</param>
38 /// <returns>數組</returns>
39 public byte[] StructureToByteArray<T>(T stuff) where T : struct
40 {
41     int size = 0;
42     IntPtr? msgPtr = null;
43     byte[] resBuf = null;
44     try
45     {
46         size = Marshal.SizeOf(stuff);
47         resBuf = new byte[size];
48         msgPtr = Marshal.AllocHGlobal(size);
49         Marshal.StructureToPtr(stuff, msgPtr.Value, false);
50         Marshal.Copy(msgPtr.Value, resBuf, 0, size);
51     } finally
52     {
53         if (msgPtr != null)
54         {
55             Marshal.FreeHGlobal(msgPtr.Value);
56         }
57     }
58     return resBuf;
59 }

 字元串與char數組、byte數組轉換

 1 /// <summary>
 2 /// 將char數組空餘部分填充預設值
 3 /// </summary>
 4 /// <param name="data">目標Char數組</param>
 5 /// <param name="defLength">數組總長度</param>
 6 /// <returns>空餘部分被填充預設值的新數組</returns>
 7 public static char[] ExtArrayFill(this char[] data, int defLength)
 8 {
 9     defLength = defLength - data.Length;
10     char[] dCharArray = new char[defLength];
11     int i = 0;
12     while (i < defLength)
13     {
14         dCharArray[i++] = '\0';
15     }
16     char[] nCharArray = new char[data.Length + defLength];
17     Array.Copy(data, 0, nCharArray, 0, data.Length);
18     Array.Copy(dCharArray, 0, nCharArray, data.Length, defLength);
19     return nCharArray;
20 }
21 /// <summary>
22 /// 將string轉為byte[],並填充預設值\0
23 /// </summary>
24 /// <param name="data">string數據</param>
25 /// <param name="defLength">長度</param>
26 /// <returns>填充後的bytre[]</returns>
27 public static char[] ExtArrayFill(this string data, int defLength)
28 {
29     defLength = defLength - data.Length;
30     char[] def = new char[defLength];
31     int i = 0;
32     while (i < defLength)
33     {
34         def[i++] = '\0';
35     }
36     string defStr = new string(def);
37     string nStr = data + defStr;
38 
39     return nStr.ToCharArray();
40 }
41 /// <summary>
42 /// 將GB2312編碼string轉為char[],並填充預設值
43 /// </summary>
44 /// <param name="data">string數據</param>
45 /// <param name="defLength">長度</param>
46 /// <returns>填充後的bytre[]</returns>
47 public static byte[] ExtArrayFillGb2312(this string data, int defLength) {
48     byte[] tmpBuf = new byte[defLength];
49     for (int i = 0; i < defLength; i++) {
50         tmpBuf[i] = 0;
51     }
52     Encoding gb2312 = Encoding.GetEncoding("gb2312");
53     byte[] tmpDataBuf = gb2312.GetBytes(data);
54     for (int i = 0; i < tmpDataBuf.Length; i++) {
55         if (tmpDataBuf.Length >= defLength)
56             break;
57         tmpBuf[i] = tmpDataBuf[i];
58     }
59     return tmpBuf;
60 }

 Windows消息處理

 1 struct COPYDATASTRUCT
 2 {
 3     public IntPtr dwData;
 4     public int cbData;
 5     [MarshalAs(UnmanagedType.LPStr)]
 6     public string lpData;
 7 }
 8 /// <summary>
 9 /// Windows消息處理輔助工具類
10 /// </summary>
11 public static class MessageUtils
12 {
13     const int WM_COPYDATA = 0x004A;
14 
15     [DllImport("User32.dll", EntryPoint = "SendMessage")]
16     private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
17 
18     [DllImport("User32.dll", EntryPoint = "FindWindow")]
19     private static extern int FindWindow(string lpClassName, string lpWindowName);
20     /// <summary>
21     /// 發佈WM_COPYDATA消息
22     /// </summary>
23     /// <param name="strWindowName">進程窗體title</param>
24     /// <param name="iData">ushort自定義數據</param>
25     /// <param name="strData">string自定義數據</param>
26     /// <returns></returns>
27     public static bool SendCopyData(string strWindowName, ushort iData, string strData)
28     {
29         int hWnd = FindWindow(null, strWindowName);
30         if (hWnd == 0)
31         {
32             return false;
33         }
34         else
35         {
36             byte[] sarr = System.Text.Encoding.ASCII.GetBytes(strData);
37             int len = sarr.Length;
38             COPYDATASTRUCT cds;
39             cds.dwData = (IntPtr)Convert.ToInt16(iData);//任意值
40             cds.cbData = len + 1;//
41             cds.lpData = strData;
42             SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
43             return true;
44         }
45     }
46 }

 字元串編碼轉換

 1 /// <summary>
 2 /// GB2312編碼字元串轉UTF-8編碼字元串
 3 /// </summary>
 4 /// <param name="strGb2312">GB2312編碼字元串</param>
 5 /// <returns>UTF-8編碼字元串</returns>
 6 public static string Gb2312ToUtf8(string strGb2312) {
 7     Encoding gb2312 = Encoding.GetEncoding("gb2312");
 8     byte []gbBuf=gb2312.GetBytes(strGb2312);
 9     Encoding utf8 = Encoding.GetEncoding("utf-8");
10     byte[] u8Buf = null;
11     u8Buf = Encoding.Convert(gb2312, utf8, gbBuf);
12     string strUtf8 = utf8.GetString(u8Buf);
13     return strUtf8;
14 }
15 /// <summary>
16 /// GB2312編碼byte數組轉UTF-8編碼字元串
17 /// </summary>
18 /// <param name="gb2312Buf">Gb2312數組</param>
19 /// <returns>Utf8數組</returns>
20 public static string Gb2312ToUtf8(byte[] gb2312Buf) {
21     Encoding gb2312 = Encoding.GetEncoding("gb2312");
22     string strGb = gb2312.GetString(gb2312Buf);
23     return Gb2312ToUtf8(strGb);
24 }
25 /// <summary>
26 /// 字元串字元集編碼轉換
27 /// </summary>
28 /// <param name="srcEncodingName">源字元集</param>
29 /// <param name="dstEncodingName">目標字元集</param>
30 /// <param name="srcString">源字元集編碼字元串</param>
31 /// <returns>生成目標字元集編碼字元串</returns>
32 public static string StrConvert(string srcEncodingName, string dstEncodingName, string srcString) {
33     Encoding srcEncoding = Encoding.GetEncoding(srcEncodingName);
34     byte[] srcBuf = srcEncoding.GetBytes(srcString);
35     Encoding dstEncoding = Encoding.GetEncoding(dstEncodingName);
36     byte[] dstBuf = null;
37     dstBuf = Encoding.Convert(srcEncoding, dstEncoding, srcBuf);
38     string strDest = dstEncoding.GetString(dstBuf);
39     return strDest;
40 }
41 /// <summary>
42 /// GB2312編碼字元串轉UTF-8編碼字元串
43 /// </summary>
44 /// <param name="strGb2312">GB2312編碼字元串</param>
45 /// <returns>UTF-8編碼字元串</returns>
46 public static string Gb2312ToUtf8Ex(this string strGb2312) {
47     return Gb2312ToUtf8(strGb2312);
48 }
49         
50 
51 /// <summary>
52 /// 字元串字元集編碼轉換
53 /// </summary>
54 /// <param name="srcEncodingName">源字元集</param>
55 /// <param name="dstEncodingName">目標字元集</param>
56 /// <param name="srcString">源字元集編碼字元串</param>
57 /// <returns>生成目標字元集編碼字元串</returns>
58 public static string StrConvertEx(this string srcString, string srcEncodingName, string dstEncodingName) {
59     return StrConvert(srcEncodingName, dstEncodingName, srcString);
60 }

通過反射獲取對象所有屬性集合,以鍵值對形式展現

 1 /// <summary>
 2 /// 獲取對象所有屬性鍵值對
 3 /// </summary>
 4 /// <typeparam name="T">對象類型</typeparam>
 5 /// <param name="t">目標對象</param>
 6 /// <returns>對象鍵值對集</returns>
 7 public Dictionary<string, object> GetObjProperties<T>(T t)
 8 {
 9     Dictionary<string, object> res = new Dictionary<string, object>();
10     if (t == null)
11     {
12         return null;
13     }
14     var properties = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
15 
16     if (properties.Length <= 0)
17     {
18         return null;
19     }
20     foreach (var item in properties)
21     {
22         string name = item.Name;
23         object value = item.GetValue(t, null);
24         if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String"))
25         {
26             res.Add(name, value);
27         } else
28         {
29             GetObjProperties(value);
30         }
31     }
32     return res;
33 }

 實體類轉SQL條件字元串

 1 /// <summary>
 2 /// 實體類轉SQL條件,實體類參數中值為null的屬性不參與SQL生成,故此,本函數不支持null查詢
 3 /// </summary>
 4 /// <typeparam name="T">實體類對象類型</typeparam>
 5 /// <param name="entity">作為查詢條件的實體類</param>
 6 /// <param name="logicOperator">各屬性間邏輯運算符(如AND,OR)</param>
 7 /// <returns>SQL條件字元串</returns>
 8 public string EntityToSqlCondition<T>(T entity, string logicOperator)
 9 {
10     if (entity == null)
11     {
12         return null;
13     }
14     var properties = entity.GetType()
15         .GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public)
16         .AsEnumerable().Where(p => p.GetValue(entity, null) != null);
17 
18     if (properties.Count() <= 0)
19     {
20         return null;
21     }
22     StringBuilder sbCondition = new StringBuilder(" ");
23     int index = 0;
24     foreach (var item in properties)
25     {
26         string name = item.Name;
27         object value = item.GetValue(entity, null);
28         if (index != properties.Count() - 1)
29         {
30             if (item.PropertyType.IsValueType)
31             {
32                 sbCondition.AppendFormat("{0}={1} {2} ", name, value, logicOperator);
33             } else if (item.PropertyType.Name.StartsWith("String"))
34             {
35                 sbCondition.AppendFormat("{0}='{1}' {2} ", name, value, logicOperator);
36             }
37         } else
38         {
39             if (item.PropertyType.IsValueType)
40             {
41                 sbCondition.AppendFormat(" {0}={1} ", name, value);
42             } else if (item.PropertyType.Name.StartsWith("String"))
43             {
44                 sbCondition.AppendFormat(" {0}='{1}' ", name, value);
45             }
46         }
47         index++;
48     }
49     return sbCondition.ToString();
50 }

 

 

待續


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天看到技術群中發了一個查詢天氣的api, "http://www.sojson.com/open/api/weather/json.shtml?city=南昌" 點進去看,發現伺服器傳回來一個天氣信息的json,剛好也在學C 解析json,就乾脆拿這個作為一個實例了。 首先,介紹一下Json: J ...
  • 在 asp.net 中,我們可以藉助 Application 來保存一些伺服器端全局變數,比如說伺服器端同時線上的人數計數,比如一些網站的配置信息。 在 ASP.NET 應用中,之前開發的活動室預約系統把網站的 keyword 以及 Title 等信息,在網站啟動的時候會從資料庫載入配置並保存到 A... ...
  • 一.介紹 前一篇,介紹了ASP.NET Core部署到K8S上,下麵介紹我們在發佈新一版本中怎麼通過Gitlab CI自動給鏡像打版本並部署到K8S上. 二.我們通過GitLab CI/CD 變數 不廢話,先上代碼: 上面的.gitlab-ci.yml 可以看到平常開發人員提交代碼先 build , ...
  • 上一篇我們聊到了容器,現在大家應該也知道了,沒有鏡像就沒有容器,所以鏡像對docker來說是非常重要的,關於鏡像的特性和原理作為入門系列就不闡 述了,我還是通過aspnetcore的小sample去熟悉鏡像的操控。 一:鏡像在哪裡 這個問題問到點子上了,就好像說肉好吃,那你告訴我哪裡才能買的到? 1 ...
  • 新建控制台應用(.Net Core)程式 添加json文件,命名為 appsettings.json ,設置文件屬性 。添加內容如下 nuget添加相關引用 依次添加以下引用 實現思路 在看到《.NET 通用主機》的文章之後,認為可以嘗試藉助GenericHost更優雅的在Console項目中使用a ...
  • 目錄,是指書籍、文檔正文前所載的目次,將主要內容以一定次第順序編排,起指導閱讀、檢索內容的作用。在Word中生成目錄前,需要設置文檔相應文字或者段落的大綱級別,根據設定的大綱級別可創建文檔的互動式大綱,即在Word文檔左側導航視窗中可顯示為如同目錄的標題大綱,通過點擊相應級別的內容,可跟蹤閱讀位置或 ...
  • 一.概述 EF實體關係定義了兩個實體互相關聯起來(主體實體和依賴實體的關係,對應資料庫中主表和子表關係)。 在關係型資料庫中,這種表示是通過外鍵約束來體現。本篇主要講一對多的關係。先瞭解下描述關係的術語。 (1) 依賴實體: 這是包含外鍵屬性的實體(子表)。有時稱為 child 。 (2) 主體實體 ...
  • 索引: 目錄索引 一.API 列表 C# 代碼中 String.Contains("conditionStr") 生成 SQL 對應的 like '%conditionStr%' 如:.Queryer<Agent>() ... ... .Where(it => it.PathId.Contains( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...