c#註冊表對象映射

来源:http://www.cnblogs.com/mokeyish/archive/2016/10/15/5965083.html
-Advertisement-
Play Games

用於快捷保存與讀取註冊表,為對應的對象 示例 保存 讀取 1 #region summary 2 // 3 // <copyright file="IRegistry.cs" company="personal"> 4 // 用戶:mokeyish 5 // 日期:2016/10/15 6 // 時 ...


用於快捷保存與讀取註冊表,為對應的對象

示例

        [RegistryRoot(Name = "superAcxxxxx")]
        public class Abc : IRegistry
        {
            public string Name { get; set; }

            public int Age { get; set; }
        }

保存

            Abc a = new Abc
            {
                Name = "mokeyish",
                Age = 100
            };
            RegistryKey register = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, Environment.Is64BitOperatingSystem
                ? RegistryView.Registry64
                : RegistryView.Registry32);

            RegistryKey writeKey=register.CreateSubKey("SOFTWARE");
            if (writeKey != null)
            {
                a.Save(writeKey);
                writeKey.Dispose();
            }
            register.Dispose();

 

讀取

            Abc a=new Abc();
            RegistryKey register = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, Environment.Is64BitOperatingSystem
                ? RegistryView.Registry64
                : RegistryView.Registry32);

            RegistryKey writeKey=register.OpenSubKey("SOFTWARE");
            if (writeKey != null)
            {
                a.Read(writeKey);

                writeKey.Dispose();
            }
            register.Dispose();

 

 

  1 #region summary
  2 //   ------------------------------------------------------------------------------------------------
  3 //   <copyright file="IRegistry.cs" company="personal">
  4 //     用戶:mokeyish
  5 //     日期:2016/10/15
  6 //     時間:13:26
  7 //   </copyright>
  8 //   ------------------------------------------------------------------------------------------------
  9 #endregion
 10 
 11 namespace RegistryHelp 
 12 {
 13     using System;
 14     using System.Collections.Generic;
 15     using System.Linq;
 16     using System.Reflection;
 17     using Microsoft.Win32;
 18 
 19     /// <summary>
 20     /// 可用於註冊表快捷保存讀取的介面
 21     /// </summary>
 22     public interface IRegistry { }
 23 
 24     /// <summary>
 25     /// RegistryExitensionMethods
 26     /// </summary>
 27     public static class RegistryExitensionMethods
 28     {
 29         private static readonly Type IgnoreAttribute = typeof(RegistryIgnoreAttribute);
 30         private static readonly Type MemberAttribute = typeof(RegistryMemberAttribute);
 31         private static readonly Type RegistryInterface = typeof(IRegistry);
 32 
 33         /// <summary>
 34         /// 讀取註冊表
 35         /// </summary>
 36         /// <param name="rootKey"></param>
 37         /// <param name="registry"></param>
 38         /// <param name="name"></param>
 39         /// <exception cref="ArgumentNullException">registry is null</exception>
 40         /// <exception cref="Exception">Member type is same with Class type.</exception>
 41         public static bool Read(this RegistryKey rootKey, IRegistry registry, string name = null)
 42         {
 43             if (registry == null) throw new ArgumentNullException(nameof(registry));
 44 
 45             rootKey = rootKey.OpenSubKey(name ?? registry.GetRegistryRootName());
 46 
 47             if (rootKey == null) return false;
 48             
 49             using (rootKey)
 50             {
 51                 Tuple<PropertyInfo[], FieldInfo[]> members = registry.GetMembers();
 52 
 53                 if (members.Item1.Length + members.Item2.Length == 0) return false;
 54 
 55                 foreach (PropertyInfo property in members.Item1)
 56                 {
 57                     string registryName = property.GetRegistryName();
 58                     object value;
 59                     if (RegistryInterface.IsAssignableFrom(property.PropertyType))
 60                     {
 61                         if (property.PropertyType == registry.GetType())
 62                         {
 63                             throw new Exception("Member type is same with Class type.");
 64                         }
 65 
 66                         object oldvalue = property.GetValue(registry, null);
 67                         value = oldvalue ?? Activator.CreateInstance(property.PropertyType);
 68                         if (!rootKey.Read((IRegistry) value, registryName)) value = null;
 69                     }
 70                     else
 71                     {
 72                         value = rootKey.GetValue(registryName);
 73                     }
 74 
 75                     if (value != null) property.SetValue(registry, ChangeType(value, property.PropertyType), null);
 76                 }
 77 
 78                 foreach (FieldInfo fieldInfo in members.Item2)
 79                 {
 80                     string registryName = fieldInfo.GetRegistryName();
 81                     object value;
 82                     if (RegistryInterface.IsAssignableFrom(fieldInfo.FieldType))
 83                     {
 84                         if (fieldInfo.FieldType == registry.GetType())
 85                         {
 86                             throw new Exception("Member type is same with Class type.");
 87                         }
 88 
 89                         value = fieldInfo.GetValue(registry) ?? Activator.CreateInstance(fieldInfo.FieldType);
 90                         rootKey.Read((IRegistry) value, registryName);
 91                     }
 92                     else
 93                     {
 94                         value = rootKey.GetValue(registryName);
 95                     }
 96 
 97                     if (value != null) fieldInfo.SetValue(registry, ChangeType(value, fieldInfo.FieldType));
 98                 }
 99             }
100 
101             return true;
102         }
103 
104         /// <summary>
105         /// 保存到註冊表
106         /// </summary>
107         /// <param name="rootKey"></param>
108         /// <param name="registry"></param>
109         /// <param name="name"></param>
110         /// <exception cref="ArgumentNullException">registry is null</exception>
111         /// <exception cref="Exception">Member type is same with Class type.</exception>
112         public static bool Save(this RegistryKey rootKey, IRegistry registry, string name = null)
113         {
114             if (registry == null) throw new ArgumentNullException(nameof(registry));
115 
116             rootKey = rootKey.CreateSubKey(name ?? registry.GetRegistryRootName());
117 
118             if (rootKey == null) return false;
119 
120             using (rootKey)
121             {
122                 Tuple<PropertyInfo[], FieldInfo[]> members = registry.GetMembers();
123 
124                 if (members.Item1.Length + members.Item2.Length == 0) return false;
125 
126                 foreach (PropertyInfo property in members.Item1)
127                 {
128                     string registryName = property.GetRegistryName();
129                     object value = property.GetValue(registry, null);
130                     if (RegistryInterface.IsAssignableFrom(property.PropertyType))
131                     {
132                         if (property.PropertyType == registry.GetType())
133                         {
134                             throw new Exception("Member type is same with Class type.");
135                         }
136 
137                         if (value != null) rootKey.Save((IRegistry) value, registryName);
138                     }
139                     else
140                     {
141                         value = ChangeType(value, TypeCode.String);
142                         if (value != null) rootKey.SetValue(registryName, value, RegistryValueKind.String);
143                     }
144 
145                 }
146 
147                 foreach (FieldInfo fieldInfo in members.Item2)
148                 {
149                     string registryName = fieldInfo.GetRegistryName();
150                     object value = fieldInfo.GetValue(registry);
151                     if (RegistryInterface.IsAssignableFrom(fieldInfo.FieldType))
152                     {
153                         if (fieldInfo.FieldType == registry.GetType())
154                         {
155                             throw new Exception("Member type is same with Class type.");
156                         }
157 
158                         if (value != null) rootKey.Save((IRegistry)value, registryName);
159                     }
160                     else
161                     {
162                         value = ChangeType(value, TypeCode.String);
163                         if (value != null) rootKey.SetValue(registryName, value, RegistryValueKind.String);
164                     }
165                 }
166             }
167             return true;
168         }
169 
170         /// <summary>
171         /// 讀取註冊表
172         /// </summary>
173         /// <param name="registry"></param>
174         /// <param name="rootKey"></param>
175         /// <param name="name"></param>
176         /// <exception cref="ArgumentNullException">registry is null</exception>
177         /// <exception cref="Exception">Member type is same with Class type.</exception>
178         public static bool Read(this IRegistry registry, RegistryKey rootKey, string name = null)
179         {
180             return rootKey.Read(registry, name);
181         }
182 
183         /// <summary>
184         /// 保存到註冊表
185         /// </summary>
186         /// <param name="registry"></param>
187         /// <param name="rootKey"></param>
188         /// <param name="name"></param>
189         /// <exception cref="ArgumentNullException">registry is null</exception>
190         /// <exception cref="Exception">Member type is same with Class type.</exception>
191         public static bool Save(this IRegistry registry, RegistryKey rootKey, string name = null)
192         {
193             return rootKey.Save(registry, name);
194         }
195 
196         private static object ChangeType(object value, Type conversionType)
197         {
198             if (conversionType == RegistryInterface)
199             {
200                 return value;
201             }
202 
203             if (conversionType == typeof(Guid))
204             {
205                 return new Guid((string)value);
206             }
207             
208             return Convert.ChangeType(value, conversionType);
209         }
210 
211         private static object ChangeType(object value, TypeCode typeCode)
212         {
213             if (value is IConvertible) return Convert.ChangeType(value, typeCode);
214             return value.ToString();
215         }
216 
217         private static bool IsDefinedRegistryAttribute(this MemberInfo memberInfo)
218         {
219             return memberInfo.IsDefined(IgnoreAttribute, false) || memberInfo.IsDefined(MemberAttribute, false);
220         }
221 
222         private static string GetRegistryRootName(this IRegistry registry)
223         {
224             Type rootType = registry.GetType();
225             return rootType.IsDefined(typeof(RegistryRootAttribute), false)
226                 ? rootType.GetCustomAttribute<RegistryRootAttribute>().Name
227                 : rootType.Name;
228         }
229 
230         private static string GetRegistryName(this MemberInfo memberInfo)
231         {
232             return memberInfo.IsDefined(MemberAttribute, false)
233                 ? memberInfo.GetCustomAttribute<RegistryMemberAttribute>().Name
234                 : memberInfo.Name;
235         }
236 
237         private static Tuple<PropertyInfo[], FieldInfo[]> GetMembers(this IRegistry registry)
238         {
239             if (registry == null) throw new ArgumentNullException(nameof(registry));
240             Type t = registry.GetType();
241 
242             IList<MemberInfo> lst =
243                 t.GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static |
244                              BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField |
245                              BindingFlags.SetField | BindingFlags.GetProperty | BindingFlags.SetProperty).ToList();
246 
247 
248             bool isDefinedAttribute = lst.Any(i => i.IsDefinedRegistryAttribute());
249 
250             return isDefinedAttribute
251                 ? new Tuple<PropertyInfo[], FieldInfo[]>(lst.OfType<PropertyInfo>().ToArray(),
252                     lst.OfType<FieldInfo>().ToArray())
253                 : new Tuple<PropertyInfo[], FieldInfo[]>(t.GetProperties(), t.GetFields());
254         }
255     }
256     
257     /// <summary>
258     /// RegistryRootAttribute:用於描述註冊表對象類
259     /// </summary>
260     [AttributeUsage(AttributeTargets.Class)]
261     public class RegistryRootAttribute : Attribute
262     {
263         /// <summary>
264         /// Name
265         /// </summary>
266         public string Name { get; set; }
267 
268         /// <summary>
269         /// Value
270         /// </summary>
271         public string Value { get; set; }
272     }
273     
274     /// <summary>
275     /// RegistryIgnoreAttribute:忽略註冊表成員,使用了該特性,將忽略未定義RegistryMemberAttribute的成員
276     /// </summary>
277     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
278     public class RegistryIgnoreAttribute : Attribute { }
279 
280     /// <summary>
281     /// RegistryMemberAttribute:用於描述註冊表成員,使用了該特性,將忽略未定義RegistryMemberAttribute的成員
282     /// </summary>
283     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
284     public class RegistryMemberAttribute : Attribute
285     {
286         /// <summary>
287         /// Name
288         /// </summary>
289         public string Name { get; set; }
290     }
291 }
註冊表對象映射

 


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

-Advertisement-
Play Games
更多相關文章
  • 剖析 AssemblyInfo.cs - 瞭解常用的特性 Attribute 【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/5944391.html 序 上次,我們通過《C# 知識回顧 - 特性 Attribute》已經瞭解如何創建和使用特性 Attr ...
  • LinQ: LinQ to Sql類它是一個集成化的數據訪問類,微軟將原本需要我們自己動手去編寫的一些代碼,集成到了這個類中,會自動生成。 資料庫數據訪問,能大大減少代碼量。 那就是代碼量減少 EF框架 LinQ的創建: LinQ的查詢: ...
  • LinQ: 1.LinQ to Sql類(NET Language Integrated Query (LINQ) ) LINQ定義了大約40個查詢操作符,如select、from、in、where以及order by(C#中)。使用這些操作符可以編寫查詢語句。不過,這些查詢還可以基於很多類型的數據 ...
  • LinQ:LinQ to Sql類 它是一個集成化的數據訪問類,微軟將原本需要我們自己動手去編寫的一些代碼,集成到了這個類中,會自動生成。 LinQ的創建: 添加項——添加新項(LinQ to Sql類):每個資料庫對應一個LinQ to Sql類 在類裡面連接資料庫: 伺服器資源管理器——連接到數 ...
  • LINQ,語言集成查詢(Language Integrated Query)是一組用於c#和VB語言的擴展。它允許編寫C#或者Visual Basic代碼以查詢資料庫相同的方式操作記憶體數據。 他是一個集成化的數據訪問類,微軟將原本需要我們自己動去編寫的一些代碼,集成到這個類中,會自動生成。 資料庫數 ...
  • 原文地址 :http://blog.csdn.net/mygisforum/article/details/8249093 http://www.cnblogs.com/wang985850293/p/5148927.html ...
  • 1、背景 用Jquery中Ajax方式在asp.net開發環境中WebService介面的調用 2、出現的問題 原因分析:瀏覽器同源策略的影響(即JavaScript或Cookie只能訪問同域下的內容); 3、解決方案: (1) JSONP:只支持GET方式 (2) CROS:跨域資源共用 以下為C ...
  • 用VS15 preview 5打開文件夾(詳情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夾下多一個slnx.VC.db文件,如下圖: 本文件是SQLite文件,通過Navicat Premium打開,配置如下: 打開如下: 一共有14張數... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...