.NET开发不可不知、不可不用的辅助类(一)

简介:
1. 用于获取或设置Web.config/*.exe.config中节点数据的辅助类
     /// <summary>
    
/// 用于获取或设置Web.config/*.exe.config中节点数据的辅助类
    
/// </summary>

     public  sealed  class AppConfig
     {
        private string filePath;

        /// <summary>
        
/// 从当前目录中按顺序检索Web.Config和*.App.Config文件。
        
/// 如果找到一个,则使用它作为配置文件;否则会抛出一个ArgumentNullException异常。
        
/// </summary>

        public AppConfig()
        {
            string webconfig = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Web.Config");
            string appConfig = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile.Replace(".vshost", "");

            if (File.Exists(webconfig))
            {
                filePath = webconfig;
            }

            else if (File.Exists(appConfig))
            {
                filePath = appConfig;
            }

            else
            {
                throw new ArgumentNullException("没有找到Web.Config文件或者应用程序配置文件, 请指定配置文件");
            }

        }



        /// <summary>
        
/// 用户指定具体的配置文件路径
        
/// </summary>
        
/// <param name="configFilePath">配置文件路径(绝对路径)</param>

        public AppConfig(string configFilePath)
        {
            filePath = configFilePath;
        }


        /// <summary>
        
/// 设置程序的config文件
        
/// </summary>
        
/// <param name="keyName">键名</param>
        
/// <param name="keyValue">键值</param>

        public void AppConfigSet(string keyName, string keyValue)
        {
            //由于存在多个Add键值,使得访问appSetting的操作不成功,故注释下面语句,改用新的方式
            /* 
            string xpath = "//add[@key='" + keyName + "']";
            XmlDocument document = new XmlDocument();
            document.Load(filePath);

            XmlNode node = document.SelectSingleNode(xpath);
            node.Attributes["value"].Value = keyValue;
            document.Save(filePath); 
             
*/


            XmlDocument document = new XmlDocument();
            document.Load(filePath);

            XmlNodeList nodes = document.GetElementsByTagName("add");
            for (int i = 0; i < nodes.Count; i++)
            {
                //获得将当前元素的key属性
                XmlAttribute attribute = nodes[i].Attributes["key"];
                //根据元素的第一个属性来判断当前的元素是不是目标元素
                if (attribute != null && (attribute.Value == keyName))
                {
                    attribute = nodes[i].Attributes["value"];
                    //对目标元素中的第二个属性赋值
                    if (attribute != null)
                    {
                        attribute.Value = keyValue;
                        break;
                    }

                }

            }

            document.Save(filePath);
        }


        /// <summary>
        
/// 读取程序的config文件的键值。
        
/// 如果键名不存在,返回空
        
/// </summary>
        
/// <param name="keyName">键名</param>
        
/// <returns></returns>

        public string AppConfigGet(string keyName)
        {
            string strReturn = string.Empty;
            try
            {
                XmlDocument document = new XmlDocument();
                document.Load(filePath);

                XmlNodeList nodes = document.GetElementsByTagName("add");
                for (int i = 0; i < nodes.Count; i++)
                {
                    //获得将当前元素的key属性
                    XmlAttribute attribute = nodes[i].Attributes["key"];
                    //根据元素的第一个属性来判断当前的元素是不是目标元素
                    if (attribute != null && (attribute.Value == keyName))
                    {
                        attribute = nodes[i].Attributes["value"];
                        if (attribute != null)
                        {
                            strReturn = attribute.Value;
                            break;
                        }

                    }

                }

            }

            catch
            {
                ;
            }


            return strReturn;
        }


        /// <summary>
        
/// 获取指定键名中的子项的值
        
/// </summary>
        
/// <param name="keyName">键名</param>
        
/// <param name="subKeyName">以分号(;)为分隔符的子项名称</param>
        
/// <returns>对应子项名称的值(即是=号后面的值)</returns>

        public string GetSubValue(string keyName, string subKeyName)
        {
            string connectionString = AppConfigGet(keyName).ToLower();
            string[] item = connectionString.Split(new char[] {';'});

            for (int i = 0; i < item.Length; i++)
            {
                string itemValue = item[i].ToLower();
                if (itemValue.IndexOf(subKeyName.ToLower()) >= 0) //如果含有指定的关键字
                {
                    int startIndex = item[i].IndexOf("="); //等号开始的位置
                    return item[i].Substring(startIndex + 1); //获取等号后面的值即为Value
                }

            }

            return string.Empty;
        }

}
AppConfig测试代码:
     public  class TestAppConfig
     {
        public static string Execute()
        {
            string result = string.Empty;

            //读取Web.Config的
            AppConfig config = new AppConfig();
            result += "读取Web.Config中的配置信息:" + "\r\n";
            result += config.AppName + "\r\n";
            result += config.AppConfigGet("WebConfig") + "\r\n";

            config.AppConfigSet("WebConfig", DateTime.Now.ToString("hh:mm:ss"));
            result += config.AppConfigGet("WebConfig") + "\r\n\r\n";


            //读取*.App.Config的
            config = new AppConfig("TestUtilities.exe.config");
            result += "读取TestUtilities.exe.config中的配置信息:" + "\r\n";
            result += config.AppName + "\r\n";
            result += config.AppConfigGet("AppConfig") + "\r\n";

            config.AppConfigSet("AppConfig", DateTime.Now.ToString("hh:mm:ss"));
            result += config.AppConfigGet("AppConfig") + "\r\n\r\n";


            return result;
        }

    }
2. 反射操作辅助类ReflectionUtil
     /// <summary>
    
/// 反射操作辅助类
    
/// </summary>

     public  sealed  class ReflectionUtil
     {
        private ReflectionUtil()
        {
        }


        private static BindingFlags bindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Public |
                                                   BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;

        /// <summary>
        
/// 执行某个方法
        
/// </summary>
        
/// <param name="obj">指定的对象</param>
        
/// <param name="methodName">对象方法名称</param>
        
/// <param name="args">参数</param>
        
/// <returns></returns>

        public static object InvokeMethod(object obj, string methodName, object[] args)
        {
            object objResult = null;
            Type type = obj.GetType();
            objResult = type.InvokeMember(methodName, bindingFlags | BindingFlags.InvokeMethod, null, obj, args);
            return objResult;
        }


        /// <summary>
        
/// 设置对象字段的值
        
/// </summary>

        public static void SetField(object obj, string name, object value)
        {
            FieldInfo fieldInfo = obj.GetType().GetField(name, bindingFlags);
            object objValue = Convert.ChangeType(value, fieldInfo.FieldType);
            fieldInfo.SetValue(objValue, value);
        }


        /// <summary>
        
/// 获取对象字段的值
        
/// </summary>

        public static object GetField(object obj, string name)
        {
            FieldInfo fieldInfo = obj.GetType().GetField(name, bindingFlags);
            return fieldInfo.GetValue(obj);
        }


        /// <summary>
        
/// 设置对象属性的值
        
/// </summary>

        public static void SetProperty(object obj, string name, object value)
        {
            PropertyInfo propertyInfo = obj.GetType().GetProperty(name, bindingFlags);
            object objValue = Convert.ChangeType(value, propertyInfo.PropertyType);
            propertyInfo.SetValue(obj, objValue, null);
        }


        /// <summary>
        
/// 获取对象属性的值
        
/// </summary>

        public static object GetProperty(object obj, string name)
        {
            PropertyInfo propertyInfo = obj.GetType().GetProperty(name, bindingFlags);
            return propertyInfo.GetValue(obj, null);
        }


        /// <summary>
        
/// 获取对象属性信息(组装成字符串输出)
        
/// </summary>

        public static string GetProperties(object obj)
        {
            StringBuilder strBuilder = new StringBuilder();
            PropertyInfo[] propertyInfos = obj.GetType().GetProperties(bindingFlags);

            foreach (PropertyInfo property in propertyInfos)
            {
                strBuilder.Append(property.Name);
                strBuilder.Append(":");
                strBuilder.Append(property.GetValue(obj, null));
                strBuilder.Append("\r\n");
            }


            return strBuilder.ToString();
        }

    }
反射操作辅助类ReflectionUtil测试代码:
     public  class TestReflectionUtil
     {
        public static string Execute()
        {
            string result = string.Empty;
            result += "使用ReflectionUtil反射操作辅助类:" + "\r\n";

            try
            {
                Person person = new Person();
                person.Name = "wuhuacong";
                person.Age = 20;
                result += DecriptPerson(person);

                person.Name = "Wade Wu";
                person.Age = 99;
                result += DecriptPerson(person);
            }

            catch (Exception ex)
            {
                result += string.Format("发生错误:{0}!\r\n \r\n", ex.Message);
            }

            return result;
        }


        public static string DecriptPerson(Person person)
        {
            string result = string.Empty;

            result += "name:" + ReflectionUtil.GetField(person, "name") + "\r\n";
            result += "age" + ReflectionUtil.GetField(person, "age") + "\r\n";

            result += "Name:" + ReflectionUtil.GetProperty(person, "Name") + "\r\n";
            result += "Age:" + ReflectionUtil.GetProperty(person, "Age") + "\r\n";

            result += "Say:" + ReflectionUtil.InvokeMethod(person, "Say", new object[] {}) + "\r\n";

            result += "操作完成!\r\n \r\n";

            return result;
        }

    }
3. 注册表访问辅助类RegistryHelper
     /// <summary>
    
/// 注册表访问辅助类
    
/// </summary>

     public  sealed  class RegistryHelper
     {
        private string softwareKey = string.Empty;
        private RegistryKey rootRegistry = Registry.CurrentUser;

        /// <summary>
        
/// 使用注册表键构造,默认从Registry.CurrentUser开始。
        
/// </summary>
        
/// <param name="softwareKey">注册表键,格式如"SOFTWARE\\Huaweisoft\\EDNMS"的字符串</param>

        public RegistryHelper(string softwareKey) : this(softwareKey, Registry.CurrentUser)
        {
        }


        /// <summary>
        
/// 指定注册表键及开始的根节点查询
        
/// </summary>
        
/// <param name="softwareKey">注册表键</param>
        
/// <param name="rootRegistry">开始的根节点(Registry.CurrentUser或者Registry.LocalMachine等)</param>

        public RegistryHelper(string softwareKey, RegistryKey rootRegistry)
        {
            this.softwareKey = softwareKey;
            this.rootRegistry = rootRegistry;
        }



        /// <summary>
        
/// 根据注册表的键获取键值。
        
/// 如果注册表的键不存在,返回空字符串。
        
/// </summary>
        
/// <param name="key">注册表的键</param>
        
/// <returns>键值</returns>

        public string GetValue(string key)
        {
            const string parameter = "key";
            if (null == key)
            {
                throw new ArgumentNullException(parameter);
            }


            string result = string.Empty;
            try
            {
                RegistryKey registryKey = rootRegistry.OpenSubKey(softwareKey);
                result = registryKey.GetValue(key).ToString();
            }

            catch
            {
                ;
            }


            return result;
        }


        /// <summary>
        
/// 保存注册表的键值
        
/// </summary>
        
/// <param name="key">注册表的键</param>
        
/// <param name="value">键值</param>
        
/// <returns>成功返回true,否则返回false.</returns>

        public bool SaveValue(string key, string value)
        {
            const string parameter1 = "key";
            const string parameter2 = "value";
            if (null == key)
            {
                throw new ArgumentNullException(parameter1);
            }


            if (null == value)
            {
                throw new ArgumentNullException(parameter2);
            }


            RegistryKey registryKey = rootRegistry.OpenSubKey(softwareKey, true);

            if (null == registryKey)
            {
                registryKey = rootRegistry.CreateSubKey(softwareKey);
            }

            registryKey.SetValue(key, value);

            return true;
        }

    }
注册表访问辅助类RegistryHelper测试代码:
     public  class TestRegistryHelper
     {
        public static string Execute()
        {
            string result = string.Empty;
            result += "使用RegistryHelper注册表访问辅助类:" + "\r\n";

            RegistryHelper registry = new RegistryHelper("SoftWare\\HuaweiSoft\\EDNMS");
            bool sucess = registry.SaveValue("Test", DateTime.Now.ToString("hh:mm:ss"));
            if (sucess)
            {
                result += registry.GetValue("Test");
            }


            return result;
        }

    }
4. 压缩/解压缩辅助类ZipUtil
     /// <summary>
    
/// 压缩/解压缩辅助类
    
/// </summary>

     public  sealed  class ZipUtil
     {
        private ZipUtil()
        {
        }


        /// <summary>
        
/// 压缩文件操作
        
/// </summary>
        
/// <param name="fileToZip">待压缩文件名</param>
        
/// <param name="zipedFile">压缩后的文件名</param>
        
/// <param name="compressionLevel">0~9,表示压缩的程度,9表示最高压缩</param>
        
/// <param name="blockSize">缓冲块大小</param>

        public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize)
        {
            if (! File.Exists(fileToZip))
            {
                throw new FileNotFoundException("文件 " + fileToZip + " 没有找到,取消压缩。");
            }


            using (FileStream streamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read))
            {
                FileStream fileStream = File.Create(zipedFile);
                using (ZipOutputStream zipStream = new ZipOutputStream(fileStream))
                {
                    ZipEntry zipEntry = new ZipEntry(fileToZip);
                    zipStream.PutNextEntry(zipEntry);
                    zipStream.SetLevel(compressionLevel);

                    byte[] buffer = new byte[blockSize];
                    Int32 size = streamToZip.Read(buffer, 0, buffer.Length);
                    zipStream.Write(buffer, 0, size);

                    try
                    {
                        while (size < streamToZip.Length)
                        {
                            int sizeRead = streamToZip.Read(buffer, 0, buffer.Length);
                            zipStream.Write(buffer, 0, sizeRead);
                            size += sizeRead;
                        }

                    }

                    catch (Exception ex)
                    {
                        throw ex;
                    }

                    zipStream.Finish();
                }

            }

        }


        /// <summary>
        
/// 打开sourceZipPath的压缩文件,解压到destPath目录中
        
/// </summary>
        
/// <param name="sourceZipPath">待解压的文件路径</param>
        
/// <param name="destPath">解压后的文件路径</param>

        public static void UnZipFile(string sourceZipPath, string destPath)
        {
            if (!destPath.EndsWith(Path.DirectorySeparatorChar.ToString()))
            {
                destPath = destPath + Path.DirectorySeparatorChar;
            }


            using (ZipInputStream zipInputStream = new ZipInputStream(File.OpenRead(sourceZipPath)))
            {
                ZipEntry theEntry;
                while ((theEntry = zipInputStream.GetNextEntry()) != null)
                {
                    string fileName = destPath + Path.GetDirectoryName(theEntry.Name) +
                        Path.DirectorySeparatorChar + Path.GetFileName(theEntry.Name);

                    //create directory for file (if necessary)
                    Directory.CreateDirectory(Path.GetDirectoryName(fileName));

                    if (!theEntry.IsDirectory)
                    {
                        using (FileStream streamWriter = File.Create(fileName))
                        {
                            int size = 2048;
                            byte[] data = new byte[size];
                            try
                            {
                                while (true)
                                {
                                    size = zipInputStream.Read(data, 0, data.Length);
                                    if (size > 0)
                                    {
                                        streamWriter.Write(data, 0, size);
                                    }

                                    else
                                    {
                                        break;
                                    }

                                }

                            }

                            catch
                            {
                            }

                        }

                    }

                }

            }

        }

    }
压缩/解压缩辅助类ZipUtil测试代码:
     public  class TestZipUtil
     {
        public static string Execute()
        {
            string result = string.Empty;
            result += "使用ZipUtil压缩/解压缩辅助类:" + "\r\n";

            try
            {
                ZipUtil.ZipFile("Web.Config", "Test.Zip", 6, 512);
                ZipUtil.UnZipFile("Test.Zip", "Test");

                result += "操作完成!\r\n \r\n";
            }

            catch (Exception ex)
            {
                result += string.Format("发生错误:{0}!\r\n \r\n", ex.Message);
            }

            return result;
        }

    }
本文转自博客园伍华聪的博客,原文链接: .NET开发不可不知、不可不用的辅助类(一),如需转载请自行联系原博主。


目录
相关文章
|
26天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
20天前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
29 1
|
26天前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
13天前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
2月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
123 2
|
2月前
|
开发框架 .NET C#
VSCode开发.net项目时调试无效
【9月更文挑战第22天】在使用 VSCode 开发 .NET 项目时遇到调试问题,可从项目配置、调试配置、调试器安装、运行环境、日志和错误信息等方面排查。确认项目类型及文件配置,检查 `launch.json` 文件及配置项,确保调试器扩展已安装并启用,验证 .NET 运行时版本和环境变量,查看 VSCode 输出窗口和项目日志文件,检查权限及代码错误。若问题仍未解决,可查阅官方文档或社区论坛。
|
26天前
|
C# Windows
一款基于.NET开发的简易高效的文件转换器
一款基于.NET开发的简易高效的文件转换器
|
26天前
|
开发框架 缓存 前端开发
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
|
26天前
|
前端开发 JavaScript C#
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件

热门文章

最新文章