现在的位置: 首页 > 综合 > 正文

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

2012年09月12日 ⁄ 综合 ⁄ 共 14555字 ⁄ 字号 评论关闭

///来自http://www.cnblogs.com/wuhuacong/archive/2007/12/03/980882.html

/// <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;
    }
}

/// <summary>
/// AppConfig测试代码:
/// </summary>
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;
    }
}

////////////////////////////////////////////////////////////////////////////////////

/// <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();
    }
}

/// <summary>
/// 反射操作辅助类ReflectionUtil测试代码:
/// </summary>
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;
    }
}

////////////////////////////////////////////////////

/// <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;
    }
}

/// <summary>
/// 注册表访问辅助类RegistryHelper测试代码:
/// </summary>
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;
    }
}

////////////////////////////////////////

/// <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
                        {
                        }
                    }
                }
            }
        }
    }
}

/// <summary>
/// 压缩/解压缩辅助类ZipUtil测试代码:
/// </summary>
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;
    }
}

/////////////////////////////////////////////////////////

抱歉!评论已关闭.