厚积薄发,丰富的公用类库积累,助你高效进行系统开发(9)----各种常用辅助类

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。

本篇的公用类库的介绍主题是程序开发中常用到的各种格式转换或者数据验证的辅助类,内容范围可能比较广泛,包括XML操作、序列化及反序列化操作、命令行解析,枚举对象操作,数据格式验证等等,不过都是不可多得、好用的辅助类。

本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公用类库的接口方法以及详细使用操作,力求给自己继续优化,积攒更丰富的公用类库资源,加深了解的同时,也给大家展现公用类库好的方面。

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(8)----非对称加密、BASE64加密、MD5等常用加密处理
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(7)-----声音播放、硬件信息、键盘模拟及钩子、鼠标模拟及钩子等设备相关 
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(6)----全屏截图、图标获取、图片打印、页面预览截屏、图片复杂操作等
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(5)----热键、多线程、窗体动画冻结等窗体操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(4)----CSV、Excel、INI文件、独立存储等文件相关
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(3)----数据库相关操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)----常用操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(1)----开篇总结

 

1、序列化、反序列化、节点等操作类辅助类 XmlHelper。  

实现效果

1)本辅助类主要是用来方便实现XML序列化、反序列化、节点等操作。 

2)序列化是指一个对象的实例可以被保存,保存成一个二进制串或者XML等格式字符串。反序列化这是从这些内容中还原为一个对象实例的操作。 
3)要实现对象的序列化,首先要保证该对象可以序列化。而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。实现一个类可序列化的最简便的方法就是增加Serializable属性标记类。 
4)DOM(文档对象模型)把层次中的每一个对象都称之为节点(NODE),以HTML超文本标记语言为例:整个文档的一个根就是<html>,在DOM中可以使用
document.documentElement来访问它,它就是整个节点树的根节点(ROOT)。 

实现代码

1)辅助类提供的方法接口如下所示: 

/// <summary>    
/// 构造函数    
/// </summary>    
/// <param name="XmlFile">XML文件路径</param>    
public XmlHelper(string XmlFile)   
  
#region 静态方法    
   
/// <summary>    
/// 二进制序列化    
/// </summary>    
/// <param name="path">文件路径</param>    
/// <param name="obj">对象实例</param>    
/// <returns></returns>    
public static bool Serialize(string path, object obj)    
   
/// <summary>    
/// XML序列化    
/// </summary>    
/// <param name="path">文件路径</param>    
/// <param name="obj">对象实例</param>    
/// <returns></returns>    
public static bool XmlSerialize(string path, object obj, Type type)    
   
/// <summary>    
/// 二进制反序列化    
/// </summary>    
/// <param name="path">文件路径</param>    
/// <returns></returns>    
public static object Deserialize(string path)    
   
/// <summary>    
/// XML反序列化    
/// </summary>    
/// <param name="path">文件路径</param>    
/// <param name="type">对象类型</param>    
/// <returns></returns>    
public static object XmlDeserialize(string path, Type type)   
  
#endregion   
  
#region 公用方法    
   
/// <summary>    
/// 获取指定节点下面的XML子节点    
/// </summary>    
/// <param name="XmlPathNode">XML节点</param>    
/// <returns></returns>    
public XmlNodeList Read(string XmlPathNode)    
   
/// <summary>    
/// 读取节点属性内容    
/// </summary>    
/// <param name="XmlPathNode">XML节点</param>    
/// <param name="Attrib">节点属性</param>    
/// <returns></returns>    
public string Read(string XmlPathNode, string Attrib)    
   
/// <summary>    
/// 获取元素节点对象    
/// </summary>    
/// <param name="XmlPathNode">XML节点</param>    
/// <param name="elementName">元素节点名称</param>    
/// <returns></returns>    
public XmlElement GetElement(string XmlPathNode, string elementName)    
   
/// <summary>    
/// 获取元素节点的值    
/// </summary>    
/// <param name="XmlPathNode">XML节点</param>    
/// <param name="elementName">元素节点名称</param>    
/// <returns></returns>    
public string GetElementData(string XmlPathNode, string elementName)    
   
/// <summary>    
/// 获取节点下的DataSet    
/// </summary>    
/// <param name="XmlPathNode">XML节点</param>    
/// <returns></returns>    
public DataSet GetData(string XmlPathNode)    
   
/// <summary>    
/// 替换某节点的内容    
/// </summary>    
/// <param name="XmlPathNode">XML节点</param>    
/// <param name="Content">节点内容</param>    
public void Replace(string XmlPathNode, string Content)    
   
/// <summary>    
/// 删除节点    
/// </summary>    
/// <param name="Node">节点</param>    
public void Delete(string Node)    
   
/// <summary>    
/// 插入一节点和此节点的一子节点    
/// </summary>    
/// <param name="MainNode"></param>    
/// <param name="ChildNode"></param>    
/// <param name="Element"></param>    
/// <param name="Content"></param>    
public void InsertNode(string MainNode, string ChildNode, string Element, string Content)    
   
/// <summary>    
/// 插入一个节点带一个属性     
/// </summary>    
/// <param name="MainNode">指定的XML节点</param>    
/// <param name="Element">元素名称</param>    
/// <param name="Attrib">属性名称</param>    
/// <param name="AttribContent">属性值</param>    
/// <param name="Content">内容</param>    
public void InsertElement(string MainNode, string Element, string Attrib, string AttribContent, string Content)    
   
/// <summary>    
/// 插入XML元素    
/// </summary>    
/// <param name="MainNode">指定的XML节点</param>    
/// <param name="Element">元素名称</param>    
/// <param name="Content">内容</param>    
public void InsertElement(string MainNode, string Element, string Content)    
   
/// <summary>    
/// 保存XML文档    
/// </summary>    

public void Save()   

2)辅助类XmlHelper的使用例子代码如下所示 

 SearchInfo searchInfo = new SearchInfo();    

searchInfo.FieldName = "TestFeild";    
searchInfo.FieldValue = "TestValue";    
   
string file = @"C:\searchInfo.xml";    
XmlHelper.XmlSerialize(file, searchInfo, typeof(SearchInfo));    
   
SearchInfo info2FromXml = XmlHelper.XmlDeserialize(file, typeof(SearchInfo)) as SearchInfo;    
Console.WriteLine("{0} : {0}", info2FromXml.FieldName, info2FromXml.FieldValue);  

XML序列化文件如下所示,并能通过该文件反序列化到对象实例中。 

 

3)辅助类XmlHelper操作节点的例子代码如下所示。 

//bookstore.xml文件内容    
/*
   
<?xml version="1.0" encoding="gb2312"?>   
<bookstore>   
<book genre="fantasy" ISBN="2-3631-4">   
    <title>Oberon's Legacy</title>   
    <author>Corets, Eva</author>   
    <price>5.95</price>   
</book>   
</bookstore>   
*/   
file = @"c:\bookstore.xml";    
XmlHelper helper = new XmlHelper(file);    
string value = helper.Read("bookstore/book""genre");    
Console.WriteLine(value);//fantasy    
   
value = helper.Read("bookstore/book""ISBN");    
Console.WriteLine(value);//2-3631-4    
   
value = helper.GetElementData("bookstore/book""title");    
Console.WriteLine(value);//Oberon's Legacy       
   
XmlElement element = helper.GetElement("bookstore/book""title");    
element.InnerText = "伍华聪";    
   
DataSet ds = helper.GetData("bookstore/book");    

ds.WriteXml(@"C:\ds.xml");   


2、序列化和反序列化操作辅助类 Serializer。  

实现效果

1)本辅助类主要是用来方便实现序列化合反序列化操作。 

2)序列化是指一个对象的实例可以被保存,保存成一个二进制串或者XML等格式字符串。反序列化这是从这些内容中还原为一个对象实例的操作。 
本序列化和反序列化操作,提供二进制、XML格式、Soap格式等多种方式的操作,方便对对象实例进行各种序列化操作或者对各种格式文件的反序列化操作。 

 

实现代码

1)辅助类提供的方法接口如下所示: 

#region 各种格式的序列化操作    
/// <summary>    
/// 序列化对象到二进制字节数组    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <returns></returns>    
public static byte[] SerializeToBinary(object obj)    
   
/// <summary>    
/// 序列化对象到指定的文件中    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <param name="path">文件路径</param>    
/// <param name="mode">文件打开方式</param>    
public static void SerializeToBinary(object obj, string path, FileMode mode)    
   
/// <summary>    
/// 序列号对象到文件中,创建一个新文件    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <param name="path">文件路径</param>    
public static void SerializeToBinary(object obj, string path)    
   
/// <summary>    
/// 序列化对象到Soap字符串中    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <returns></returns>    
public static string SerializeToSoap(object obj)    
   
/// <summary>    
/// 序列化对象到Soap字符串中,并保存到文件    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <param name="path">文件路径</param>    
/// <param name="mode">文件打开方式</param>    
public static void SerializeToSoap(object obj, string path, FileMode mode)    
   
/// <summary>    
/// 序列化对象到Soap字符串中,并保存到文件    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <param name="path">文件路径</param>    
public static void SerializeToSoap(object obj, string path)    
   
/// <summary>    
/// 序列化对象到XML字符串中    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <returns></returns>    
public static string SerializeToXml(object obj)    
   
/// <summary>    
/// 序列化对象到XML字符串,并保存到文件中    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <param name="path">文件路径</param>    
/// <param name="mode">文件打开方式</param>    
public static void SerializeToXmlFile(object obj, string path, FileMode mode)    
   
/// <summary>    
/// 序列化对象到XML字符串,并保存到文件中    
/// </summary>    
/// <param name="obj">待序列化的对象</param>    
/// <param name="path">文件路径</param>    
public static void SerializeToXmlFile(object obj, string path)   
  
#endregion    
   
   
/// <summary>    
/// 从指定的文件中反序列化到具体的对象    
/// </summary>    
/// <param name="type">对象的类型</param>    
/// <param name="path">文件路径</param>    
/// <returns></returns>    
public static object DeserializeFromXmlFile(Type type, string path)    
   
/// <summary>    
/// 从指定的XML字符串中反序列化到具体的对象    
/// </summary>    
/// <param name="type">对象的类型</param>    
/// <param name="s">XML字符串</param>    
/// <returns></returns>    
public static object DeserializeFromXml(Type type, string s)    
   
/// <summary>    
/// 从指定的Soap协议字符串中反序列化到具体的对象    
/// </summary>    
/// <param name="type">对象的类型</param>    
/// <param name="s">Soap协议字符串</param>    
/// <returns></returns>    
public static object DeserializeFromSoap(Type type, string s)    
   
/// <summary>    
/// 从指定的二进制字节数组中反序列化到具体的对象    
/// </summary>    
/// <param name="type">对象的类型</param>    
/// <param name="bytes">二进制字节数组</param>    
/// <returns></returns>    
public static object DeserializeFromBinary(Type type, byte[] bytes)    
   
/// <summary>    
/// 从指定的文件总,以二进制字节数组中反序列化到具体的对象    
/// </summary>    
/// <param name="type">对象的类型</param>    
/// <param name="bytes">二进制字节数组存储的文件</param>    
/// <returns></returns>    
public static object DeserializeFromBinary(Type type, string path)    
   
/// <summary>    
/// 获取对象的字节数组大小    
/// </summary>    
/// <param name="o">对象</param>    
/// <returns></returns>    
public static long GetByteSize(object o)    
   
/// <summary>    
/// 克隆一个对象    
/// </summary>    
/// <param name="o">对象</param>    
/// <returns></returns>    
public static object Clone(object o)          

2)辅助类的使用例子代码如下所示 

 public class TestSerializeUtil    

    {    
        public static string Execute()    
        {    
            string result = string.Empty;    
            result += "使用SerializeUtil序列化及反序列化的辅助类:" + "\r\n";    
                
            Person person = new Person();    
            person.Name = "wuhuacong";    
            person.Age = 20;    
                
            byte[] bytes = SerializeUtil.SerializeToBinary(person);    
            Person person2 = SerializeUtil.DeserializeFromBinary(typeof (Person), bytes) as Person;    
            result += ReflectionUtil.GetProperties(person2) + "\r\n";    
                
            string xml = SerializeUtil.SerializeToXml(person);    
            Person person3 = SerializeUtil.DeserializeFromXml(typeof (Person), xml) as Person;    
            result += "person3:\r\n" + ReflectionUtil.GetProperties(person3) + "\r\n";    
                
            result += "SerializeUtil.GetByteSize(person3):" + SerializeUtil.GetByteSize(person3) + "\r\n";    
                
            Person person4 = SerializeUtil.Clone(person3) as Person;    
            result += "person4:\r\n" + ReflectionUtil.GetProperties(person4) + "\r\n";    
                
            result += "Util.AreObjectsEqual(person3, person4):" + Util.AreObjectsEqual(person3, person4)+ "\r\n";    
                
            SerializeUtil.SerializeToXmlFile(person3, Util.CurrentPath + "person3.xml", FileMode.Create);    
            Person person5 = SerializeUtil.DeserializeFromXmlFile(typeof (Person), Util.CurrentPath + "person3.xml"as Person;    
            result += "person5:\r\n" + ReflectionUtil.GetProperties(person5) + "\r\n\r\n";    
                
            result += SerializeUtil.ReadFile(Util.CurrentPath + "person3.xml") + "\r\n\r\n";    
            result += SerializeUtil.ReadFileFromEmbedded("TestUtilities.EmbedFile.xml") + "\r\n\r\n";    
   
            return result;    
        }    
    }  

 

3、实现命令行解析的常用操作的辅助类 CommandLine。  

实现效果

1)本辅助类主要是用来方便实现命令行解析的常用操作,命令行的解析在很多情况下是非常必要的,如自动并带参数启动的操作等。 

2)命令行参数。这包括两个列表,一个是参数对,一个是独立的参数。 
3)参数是定义为键/值对。参数键必须以'-', '--'或者'\'开始,在参数和值之间必须有一个空格或者字符'='。多余的空格将被忽略。参数后面必须跟着一个值,如果没有指定值,那么字符串'true'将被指定。如果值有空格,必须使用双引号来包含字符,否则字符不能被正确解析。

实现代码

1)辅助类提供的方法接口如下所示: 

/// <summary>    
/// 解析传递的命令行参数,并返回结果到一个CommandArgs对象。    
/// 假设命令行格式: CMD [param] [[-|--|\]&lt;arg&gt;[[=]&lt;value&gt;]] [param]    
/// 例如:cmd first -o outfile.txt --compile second \errors=errors.txt third fourth --test = "the value" fifth    
/// </summary>    
/// <param name="args">命令行参数数组</param>    
/// <returns>包含转换后的命令行对象CommandArgs</returns>   

public static CommandArgs Parse(string[] args)  

 

/// <summary>    
/// 包含解析的命令行参数。这包括两个列表,一个是参数对,一个是独立的参数。    
/// </summary>    
public class CommandArgs    
{    
    /// <summary>    
    
/// 返回参数/参数值的键值字典    
    
/// </summary>    
    public Dictionary<stringstring> ArgPairs    
   
    /// <summary>    
    
/// 返回独立的参数列表    
    
/// </summary>    
    public List<string> Params    

}   

2)辅助类的使用例子代码如下所示 

/// <summary>    
/// 应用程序的主入口点。    
/// </summary>    
[STAThread]    
static void Main(string[] args)    
{    
    //参数字符串:first -o outfile.txt --compile second \errors=errors.txt third fourth --test = "the value" fifth    
   
    CommandArgs objArgs = CommandLine.Parse(args);    
        
    //键值参数列表,得到输出    
    
//o:outfile.txt    
    
//compile:second    
    
//errors:errors.txt    
    
//test:the value    
    foreach (string str in objArgs.ArgPairs.Keys)    
    {    
        Debug.WriteLine(string.Format("{0}:{1}", str, objArgs.ArgPairs[str]));    
    }    
   
   
    //非键值参数列表:得到first third fourth fifth 共四个字符串    
    foreach (string str in objArgs.Params)    
    {    
        Debug.WriteLine(str);    
    }    
   
    Application.EnableVisualStyles();    
    Application.SetCompatibleTextRenderingDefault(false);    
    Application.Run(new Form1());    

 

3)输出结果如下所示

我们给程序输入命令行参数first -o outfile.txt --compile second \errors=errors.txt third fourth --test = "the value" fifth,得到的输出结果如下所示。
o:outfile.txt    
compile:second    
errors:errors.txt    
test:the value    
first    
third    
fourth    
fifth  


4、枚举操作辅助类 EnumHelper。  

实现效果

1)本辅助类主要是用来方便实现枚举的各种相关操作。 

2)枚举操作,涉及字符串和枚举对象互转、获取枚举成员、获取名称和值集合、获取枚举值、枚举描述等操作。 
3)枚举可以说是一种强类型的对象操作,比起使用古怪字符、或者数值等内容,具有强类型,编译时刻就确定等特点,在实际开发中,我们还可以使用中文枚举来方便实现各种操作。 

实现代码

1)辅助类提供的方法接口如下所示: 

/// <summary>    
/// 通过字符串获取枚举成员实例    
/// </summary>    
/// <typeparam name="T">枚举名,比如Enum1</typeparam>    
/// <param name="member">枚举成员的常量名或常量值,    
/// 范例:Enum1枚举有两个成员A=0,B=1,则传入"A"或"0"获取 Enum1.A 枚举类型</param>    
public static T GetInstance<T>(string member)    
   
/// <summary>    
/// 获取枚举成员名称和成员值的键值对集合    
/// </summary>    
/// <typeparam name="T">枚举名,比如Enum1</typeparam>    
public static Dictionary<stringobject> GetMemberKeyValue<T>()    
   
/// <summary>    
/// 获取枚举所有成员名称    
/// </summary>    
/// <typeparam name="T">枚举名,比如Enum1</typeparam>    
public static string[] GetMemberNames<T>()    
   
/// <summary>    
/// 获取枚举成员的名称    
/// </summary>    
/// <typeparam name="T">枚举名,比如Enum1</typeparam>    
/// <param name="member">枚举成员实例或成员值,    
/// 范例:Enum1枚举有两个成员A=0,B=1,则传入Enum1.A或0,获取成员名称"A"</param>    
public static string GetMemberName<T>(object member)    
   
/// <summary>    
/// 获取枚举所有成员值    
/// </summary>    
/// <typeparam name="T">枚举名,比如Enum1</typeparam>    
public static Array GetMemberValues<T>()    
   
/// <summary>    
/// 获取枚举成员的值    
/// </summary>    
/// <typeparam name="T">枚举名,比如Enum1</typeparam>    
/// <param name="memberName">枚举成员的常量名,    
/// 范例:Enum1枚举有两个成员A=0,B=1,则传入"A"获取0</param>    
public static object GetMemberValue<T>(string memberName)    
   
/// <summary>    
/// 获取枚举的基础类型    
/// </summary>    
/// <param name="enumType">枚举类型</param>    
public static Type GetUnderlyingType(Type enumType)    
   
/// <summary>    
/// 检测枚举是否包含指定成员    
/// </summary>    
/// <typeparam name="T">枚举名,比如Enum1</typeparam>    
/// <param name="member">枚举成员名或成员值</param>    
public static bool IsDefined<T>(string member)    
   
/// <summary>    
/// 返回指定枚举类型的指定值的描述    
/// </summary>    
/// <param name="t">枚举类型</param>    
/// <param name="v">枚举值</param>    
/// <returns></returns>    
public static string GetDescription(System.Type t, object v)    
   
/// <summary>    
/// 返回指定枚举类型的指定值的名称    
/// </summary>    
/// <param name="t">指定枚举类型</param>    
/// <param name="v">指定值</param>    
/// <returns></returns>    
private static string GetName(System.Type t, object v)    
   
/// <summary>    
/// 获取枚举类型的对应序号及描述名称    
/// </summary>    
/// <param name="t">枚举类型</param>    
/// <returns></returns>    

public static SortedList GetStatus(System.Type t)    

2)辅助类的使用例子代码如下所示 

private void btnTestEnum_Click(object sender, EventArgs e)    
{    
    string desc = EnumHelper.GetDescription(typeof(SqlOperator), SqlOperator.Like);    
    MessageUtil.ShowTips(string.Format("SqlOperator.Like:{0}", desc));    
   
    SortedList list = EnumHelper.GetStatus(typeof(SqlOperator));    
    StringBuilder sb = new StringBuilder();    
    foreach (int key in list.Keys)    
    {    
        sb.AppendFormat("key:{0} Value:{1} \r\n", key, list[key]);    
    }    
    MessageUtil.ShowTips(sb.ToString());    
}   

 

5、身份证相关操作辅助类 IDCardHelper。  

实现效果

1)本辅助类主要是用来方便实现身份证的各种相关操作,验证身份证、15到18位身份证号码转换、提取省份、县市、地区区划、出生年月及判断男女等操作。 

实现代码

1)辅助类提供的方法接口如下所示: 

/// <summary>    
/// 绑定身份证类别的名称    
/// </summary>    
/// <param name="cb">ComboBox控件</param>    
public static void InitIdType(ComboBox cb)    
   
/// <summary>    
/// 获取身份证类别的名称(居民身份证、军官证、士兵证、军官离退休证、境外人员身份证明、外交人员身份证明)    
/// </summary>    
/// <returns></returns>    
public static DataTable CreateIDType()    
   
/// <summary>    
/// 验证身份证结果    
/// </summary>    
/// <param name="idcard">身份证号码</param>    
/// <returns>正确的时候返回string.Empty</returns>    
public static string Validate(string idcard)    
   
/// <summary>    
/// 15位身份证明号码转化成18位用来编码    
/// </summary>    
/// <param name="idcard">15位的身份证号码</param>    
/// <returns></returns>    
public static string IdCard15To18(string idcard)    
   
/// <summary>    
/// 获取身份证对应省份的区划    
/// </summary>    
/// <param name="id">身份证</param>    
/// <returns>头两位+4个0</returns>    
public static string GetProvince(string id)    
   
/// <summary>    
/// 获取身份证对应县市的区划    
/// </summary>    
/// <param name="id">身份证</param>    
/// <returns>头4位+2个0</returns>    
public static string GetCity(string id)    
   
/// <summary>    
/// 获取身份证对应地区的区划    
/// </summary>    
/// <param name="id">身份证</param>    
/// <returns>头6位</returns>    
public static string GetArea(string id)    
   
/// <summary>    
/// 根据身份证判断是否男女    
/// </summary>    
/// <param name="id">身份证号码</param>    
/// <returns>返回"男"或者"女"</returns>    
public static string GetSexName(string id)    
   
/// <summary>    
/// 根据身份证获取出生年月    
/// </summary>    
/// <param name="id">身份证号码</param>    
/// <returns>出生年月</returns>    

public static DateTime GetBirthday(string id)    

2)辅助类的使用例子代码如下所示 

  • 例子涉及敏感信息,自己测试下即可,呵呵    
  •  

    6、各种输入格式验证辅助类 ValidateUtil。  

    实现效果

    1)本辅助类主要是用来方便实现各种输入格式验证操作。 

    2)格式验证包括各种数字格式、中文检测、身份证、邮件、邮政编码、固定电话、手机、URL地址、IP地址、日期格式、GUID、Base64编码等格式验证。 
    3)本辅助类采用各种经过验证的正则表达式进行匹配,具有高效、准确的特点,请放心使用。 

    实现代码

    1)辅助类提供的方法接口如下所示: 

    #region 用户名密码格式    
       
    /// <summary>    
    /// 返回字符串真实长度, 1个汉字长度为2    
    /// </summary>    
    /// <returns>字符长度</returns>    
    public static int GetStringLength(string stringValue)    
       
    /// <summary>    
    /// 检测用户名格式是否有效    
    /// </summary>    
    /// <param name="userName">用户名</param>    
    /// <returns></returns>    
    public static bool IsValidUserName(string userName)    
       
    /// <summary>    
    /// 密码有效性    
    /// </summary>    
    /// <param name="password">密码字符串</param>    
    /// <returns></returns>    
    public static bool IsValidPassword(string password)   
      
    #endregion   
      
    #region 数字字符串检查    
       
    /// <summary>    
    /// int有效性    
    /// </summary>    
    static public bool IsValidInt(string val)    
       
    /// <summary>    
    /// 是否数字字符串    
    /// </summary>    
    /// <param name="inputData">输入字符串</param>    
    /// <returns></returns>    
    public static bool IsNumeric(string inputData)    
       
    /// <summary>    
    /// 是否数字字符串    
    /// </summary>    
    /// <param name="inputData">输入字符串</param>    
    /// <returns></returns>    
    public static bool IsNumber(string inputData)    
       
    /// <summary>    
    /// 是否数字字符串 可带正负号    
    /// </summary>    
    /// <param name="inputData">输入字符串</param>    
    /// <returns></returns>    
    public static bool IsNumberSign(string inputData)    
       
    /// <summary>    
    /// 是否是浮点数    
    /// </summary>    
    /// <param name="inputData">输入字符串</param>    
    /// <returns></returns>    
    public static bool IsDecimal(string inputData)    
       
    /// <summary>    
    /// 是否是浮点数 可带正负号    
    /// </summary>    
    /// <param name="inputData">输入字符串</param>    
    /// <returns></returns>    
    public static bool IsDecimalSign(string inputData)   
      
    #endregion   
      
    #region 中文检测    
       
    /// <summary>    
    /// 检测是否有中文字符    
    /// </summary>    
    public static bool IsHasCHZN(string inputData)    
       
    /// <summary>     
    /// 检测含有中文字符串的实际长度     
    /// </summary>     
    /// <param name="str">字符串</param>     
    public static int GetCHZNLength(string inputData)   
      
    #endregion   
      
    #region 常用格式    
       
    /// <summary>    
    /// 验证身份证是否合法  15 和  18位两种    
    /// </summary>    
    /// <param name="idCard">要验证的身份证</param>    
    public static bool IsIdCard(string idCard)    
       
    /// <summary>    
    /// 是否是邮件地址    
    /// </summary>    
    /// <param name="inputData">输入字符串</param>    
    /// <returns></returns>    
    public static bool IsEmail(string inputData)    
       
    /// <summary>    
    /// 邮编有效性    
    /// </summary>    
    public static bool IsValidZip(string zip)    
       
    /// <summary>    
    /// 固定电话有效性    
    /// </summary>    
    public static bool IsValidPhone(string phone)    
       
    /// <summary>    
    /// 手机有效性    
    /// </summary>    
    public static bool IsValidMobile(string mobile)    
       
    /// <summary>    
    /// 电话有效性(固话和手机 )    
    /// </summary>    
    public static bool IsValidPhoneAndMobile(string number)    
       
    /// <summary>    
    /// Url有效性    
    /// </summary>    
    static public bool IsValidURL(string url)    
       
    /// <summary>    
    /// IP有效性    
    /// </summary>    
    public static bool IsValidIP(string ip)    
       
    /// <summary>    
    /// domain 有效性    
    /// </summary>    
    /// <param name="host">域名</param>    
    /// <returns></returns>    
    public static bool IsValidDomain(string host)    
       
    /// <summary>    
    /// 判断是否为base64字符串    
    /// </summary>    
    public static bool IsBase64String(string str)    
       
    /// <summary>    
    /// 验证字符串是否是GUID    
    /// </summary>    
    /// <param name="guid">字符串</param>    
    /// <returns></returns>    
    public static bool IsGuid(string guid)   
      
    #endregion   
      
    #region 日期检查    
       
    /// <summary>    
    /// 判断输入的字符是否为日期    
    /// </summary>    
    public static bool IsDate(string strValue)    
       
    /// <summary>    
    /// 判断输入的字符是否为日期,如2004-07-12 14:25|||1900-01-01 00:00|||9999-12-31 23:59    
    /// </summary>    
    public static bool IsDateHourMinute(string strValue)   
      
    #endregion   
      
    #region 其他    
       
    /// <summary>    
    /// 检查字符串最大长度,返回指定长度的串    
    /// </summary>    
    /// <param name="sqlInput">输入字符串</param>    
    /// <param name="maxLength">最大长度</param>    
    /// <returns></returns>             
    public static string CheckMathLength(string inputData, int maxLength)    
       
    /// <summary>    
    /// 转换成 HTML code    
    /// </summary>    
    public static string Encode(string str)    
       
    /// <summary>    
    ///解析html成 普通文本    
    /// </summary>    

    public static string Decode(string str)  

    2)辅助类的使用例子代码如下所示 

    string[] qunList = lineString.Split(new char[] { ','';'' ' });    
    foreach (string qunNumber in qunList)    
    {    
        if (!string.IsNullOrEmpty(qunNumber) && ValidateUtil.IsNumber(qunNumber))    
        {   
            #region 对每个号码进行查询    
            if (!QunDict.ContainsKey(qunNumber))    
            {    
                this.lstItems.Invoke(new MethodInvoker(delegate()    
                {    
                    this.lstItems.Items.Add(qunNumber);    
                    this.lstItems.Refresh();    
                }));    
       
                QunDict.Add(qunNumber, qunNumber);    
            }    
            else   
            {    
                skipCount++;    
            }    
            #endregion    
        }    

    }  

    3)辅助类使用例子代码2如下所示 

    string src = CRegex.GetImgSrc(img);    
    bool isurl = ValidateUtil.IsValidURL(src);    
    if (isurl)    
    {    
        continue;    

    }   

    CHM帮助文档持续更新中,统一下载地址是: http://www.iqidi.com/download/commonshelp.rar 

    最新公用类库DLL+XML注释文件下载地址是:http://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar 


     

     

    主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
    专注于Winform开发框架、WCF开发框架的研究及应用。
      转载请注明出处:
    撰写人:伍华聪  http:
    //www.iqidi.com 
        

    posted on 2011-12-03 14:37 伍华聪 阅读(3147) 评论(76) 编辑 收藏

    评论

    #1楼  回复 引用 查看   

    不错,学习了,
    2011-12-03 14:47 | Quella      

    #2楼  回复 引用 查看   

    不开源的话,我建议楼主还是自己留着用吧,别害了新人们。中国程序员本来就很少有时间去学习,大多都是在项目中学习积累经验,你这个东西出来,新手们都用这个,无形之中就失去了学习的机会。对于老人们你这东西大家也无所谓,大家都有一套自己的东西。所以楼主要么开源,要么自己留着用吧,别祸害了新手们。
    2011-12-03 15:13 | 潘超      

    #3楼  回复 引用 查看   

    要 那么多无用的帮助类干什么。。。
    2011-12-03 15:23 | imfunny      

    #4楼  回复 引用 查看   

    不开源,没人用。
    2011-12-03 15:25 | 深邃的狮子座      

    #5楼  回复 引用 查看   

    不开源以后就别贴出来,省得挨骂!!!
    2011-12-03 15:29 | 放哨De老鼠      

    #6楼  回复 引用 查看   

    博主分享的是自己的设计思想,跟开源有什么关系。
    不要老瞅着别人篮子里的东西,别人也没说要请你吃。
    2011-12-03 16:12 | pulihe      

    #7楼[楼主]  回复 引用 查看   

    引用Quella:不错,学习了,

    谢谢支持,谢谢一直关注和支持该系列的朋友
    2011-12-03 16:37 | 伍华聪      

    #8楼[楼主]  回复 引用 查看   

    引用pulihe:
    博主分享的是自己的设计思想,跟开源有什么关系。
    不要老瞅着别人篮子里的东西,别人也没说要请你吃。

    感谢理解啊,太感动了
    2011-12-03 16:37 | 伍华聪      

    #9楼  回复 引用 查看   

    卧槽,还用阅读密码,是人不?
    2011-12-03 16:40 | 淡墨青衫      

    #10楼[楼主]  回复 引用 查看   

    引用潘超:不开源的话,我建议楼主还是自己留着用吧,别害了新人们。中国程序员本来就很少有时间去学习,大多都是在项目中学习积累经验,你这个东西出来,新手们都用这个,无形之中就失去了学习的机会。对于老人们你这东西大家也无所谓,大家都有一套自己的东西。所以楼主要么开源,要么自己留着用吧,别祸害了新手们。


    公用类库整理,其实是一个很艰苦的过程,当然也是一个吸收、优化、整合的过程。
    这个公用类库系列,不是不开源,而是有偿的开源方式,相信我的整理及进一步的优化提炼,会使得拥有该系列源码的朋友,会比别人多一份积累,多一份思考和保障。
    2011-12-03 16:40 | 伍华聪      

    #11楼[楼主]  回复 引用 查看   

    引用放哨De老鼠:不开源以后就别贴出来,省得挨骂!!!

    你可以飘过,但不要阻挡别人的学习和观看。
    2011-12-03 16:41 | 伍华聪      

    #12楼[楼主]  回复 引用 查看   

    引用深邃的狮子座:不开源,没人用。


    不是不开源,而是有偿的开源方式。
    我相信,一切的东西,均有其存在的价值和意义。对慧眼识珠的人,就是宝库开启之日。
    2011-12-03 16:43 | 伍华聪      

    #13楼  回复 引用 查看   

    公用类库整理,其实是一个很艰苦的过程,当然也是一个吸收、优化、整合的过程。www.rlly.net
    这个公用类库系列,不是不开源,而是有偿的开源方式,相信我的整理及进一步的优化提炼,会使得拥有该系列源码的朋友,会比别人多一份积累,多一份思考和保障。
    2011-12-03 16:46 | 399601829      

    #14楼  回复 引用 查看   

    @伍华聪
    我只是说出了大部分人的心态而已,本人从不关注不开源的东西,没有研究价值!
    2011-12-03 16:53 | 放哨De老鼠      

    #15楼  回复 引用 查看   

    又不是高科技,大家没必要都学习种地,特别是自己摸索种地。

    引用潘超:不开源的话,我建议楼主还是自己留着用吧,别害了新人们。中国程序员本来就很少有时间去学习,大多都是在项目中学习积累经验,你这个东西出来,新手们都用这个,无形之中就失去了学习的机会。对于老人们你这东西大家也无所谓,大家都有一套自己的东西。所以楼主要么开源,要么自己留着用吧,别祸害了新手们。

    #16楼  回复 引用 查看   

    帮助机器码:c4eebb6757-b24d627d35-0000000000
    阅读密码是多少?谢谢
    2011-12-03 17:47 | jamesq      

    #17楼[楼主]  回复 引用 查看   

    @jamesq
    9d319535a757b22381
    2011-12-03 17:49 | 伍华聪      

    #18楼  回复 引用 查看   

    lz我觉得你这样发很累 直接把项目发上来提供下载
    2011-12-03 18:28 | 初中程序员      

    #19楼  回复 引用 查看   

    我看了你发的这些代码 有很多可以优化和改进的地方 你把它开源出来 大家一起讨论改进优化岂不是很好 你好 他好 都好 一举两得
    2011-12-03 18:32 | 初中程序员      

    #20楼  回复 引用 查看   

    请问lz你的东西有没有卖出过 有没有 你不要以为你再网上东拼西凑了一些东西 就可以像 吉日嘎啦 那样卖钱 人家那个确确实实有技术含量 你这个需要的时候google 百度一下 要多少有多少
    2011-12-03 18:36 | 初中程序员      

    #21楼  回复 引用 查看   

    引用C#通用权限管理系统组件:
    又不是高科技,大家没必要都学习种地,特别是自己摸索种地。

    引用潘超:不开源的话,我建议楼主还是自己留着用吧,别害了新人们。中国程序员本来就很少有时间去学习,大多都是在项目中学习积累经验,你这个东西出来,新手们都用这个,无形之中就失去了学习的机会。对于老人们你这东西大家也无所谓,大家都有一套自己的东西。所以楼主要么开源,要么自己留着用吧,别祸害了新手们。

    这话是一个程序员应该说的嘛?什么叫“又不是高科技,大家没必要都学习种地,特别是自己摸索种地。”连这些基本的东西都不去搞明白是怎样实现的,还谈高科技?真是笑话!我想问只管调用别人的类库,而不知道怎样实现的人,能算作是真正的程序员嘛?
    2011-12-03 19:08 | 潘超      

    #22楼[楼主]  回复 引用 查看   

    引用潘超:
    引用C#通用权限管理系统组件:
    又不是高科技,大家没必要都学习种地,特别是自己摸索种地。

    引用潘超:不开源的话,我建议楼主还是自己留着用吧,别害了新人们。中国程序员本来就很少有时间去学习,大多都是在项目中学习积累经验,你这个东西出来,新手们都用这个,无形之中就失去了学习的机会。对于老人们你这东西大家也无所谓,大家都有一套自己的东西。所以楼主要么开源,要么自己留着用吧,别祸害了新手们。

    这话是一个程序员应该说的嘛?什么叫“又不是高科技,大家没必要都学习种地,特别是自己摸索种地。”连这些基本的东西都不去搞明白是怎样实现的,还谈高科技?真...


    有偿提供源码,自愿原则,类库可免费使用。
    2011-12-03 19:39 | 伍华聪      

    #23楼[楼主]  回复 引用 查看   

    引用初中程序员:lz我觉得你这样发很累 直接把项目发上来提供下载

    我享受这个痛苦的过程,可以了吧
    2011-12-03 19:40 | 伍华聪      

    #24楼[楼主]  回复 引用 查看   

    引用初中程序员:我看了你发的这些代码 有很多可以优化和改进的地方 你把它开源出来 大家一起讨论改进优化岂不是很好 你好 他好 都好 一举两得


    初中程序员,你懂的!
    2011-12-03 19:41 | 伍华聪      

    #25楼  回复 引用 查看   

    呵呵,有过类似的做法,但是说实话,都扔了,除了几个加密算法的ms没有现成的,保留下来了。
    时间久了你会发现,刀奈特的封装程度其实是最合适的。当你觉得非常方便的时候,有可能就是耦合过高的一种表现。比如序列化,要是我的话,我会封装到Stream而不是一个文件路径。
    没看到方法重载,独立的方法也看不出思路或者思想。
    2011-12-03 21:05 | MKing's Kindom      

    #26楼  回复 引用 查看   

    被吉日带坏了,这些个东西用铜臭染染。
    codeproject,codeplex上巨牛的东西情何以堪!
    2011-12-03 21:30 | Alvin      

    #27楼  回复 引用 查看   

    能细心整理这么多的类库出来已经很不容易了,平时写的一些方法只要自己能再稍加分离点,自己也可以抽象出不少的方法出来了。关键是积累和意识。佩服楼主的精神,不过我自己也在积累了。
    2011-12-03 21:44 | 执手泪眼      

    #28楼[楼主]  回复 引用 查看   

    引用执手泪眼:能细心整理这么多的类库出来已经很不容易了,平时写的一些方法只要自己能再稍加分离点,自己也可以抽象出不少的方法出来了。关键是积累和意识。佩服楼主的精神,不过我自己也在积累了。

    恩,谢谢关注,有争议才能引发思考,才有真正意义的价值。
    2011-12-03 22:12 | 伍华聪      

    #29楼  回复 引用 查看   

    @伍华聪
    支持伍老大,有机会采购一套。
    2011-12-03 22:29 | 有一点难      

    #30楼  回复 引用 查看   

    学习,跟着楼主学了不少东西
    2011-12-03 22:51 | 老WH虎      

    #31楼  回复 引用 查看   

    机器码:53034ee79f-fa930c197f-0000000000,
    请问阅读密码,谢谢。
    2011-12-04 08:35 | 解然      

    #32楼[楼主]  回复 引用 查看   

    @解然
    9d30906da406ba78d5
    2011-12-04 09:27 | 伍华聪      

    #33楼  回复 引用 查看   

    求阅读码:a34d10c21d-70b4dc4e78-0000000000
    上次用xp楼主发给过我阅读码,但是现在换到win7,居然不能用了啊。
    2011-12-04 10:52 | asxinyu      

    #34楼[楼主]  回复 引用 查看   

    重上评论头条,争议中前进,哈哈
    2011-12-04 11:45 | 伍华聪      

    #35楼[楼主]  回复 引用 查看   

    @asxinyu
    9d3ac063a302e17284
    2011-12-04 11:45 | 伍华聪      

    #36楼  回复 引用 查看   

    阅读码
    厉害啊,还能有这个功能。

    #37楼  回复 引用 查看   

    大家都需要谋生, 伍华聪也需要养老婆孩子,人家也没强迫你必须要购买。

    引用Alvin:
    被吉日带坏了,这些个东西用铜臭染染。
    codeproject,codeplex上巨牛的东西情何以堪!

    #38楼  回复 引用 查看   

    每个人都需要互相尊重,世界上只剩下一个人了是最无聊的事情了,我们需要有很多朋友才好。

    引用初中程序员:请问lz你的东西有没有卖出过 有没有 你不要以为你再网上东拼西凑了一些东西 就可以像 吉日嘎啦 那样卖钱 人家那个确确实实有技术含量 你这个需要的时候google 百度一下 要多少有多少

    #39楼  回复 引用 查看   

    809e2951fc-d41d8cd98f-0000000000

    我勒个去...机器码...这个怎么整?
    2011-12-04 22:08 | 重庆加戈      

    #40楼  回复 引用 查看   

    求阅读码
    机器码:83b2b85c19-d41d8cd98f-0000000000
    邮箱:liu-zunjing@163.com
    谢谢 楼主
    2011-12-04 23:52 | 尊敬      

    #41楼[楼主]  回复 引用 查看   

    引用重庆加戈:
    809e2951fc-d41d8cd98f-0000000000

    我勒个去...机器码...这个怎么整?

    9d67c730a702b02589
    2011-12-05 10:53 | 伍华聪      

    #42楼[楼主]  回复 引用 查看   

    @尊敬
    9d36926cf154e17984
    2011-12-05 10:53 | 伍华聪      

    #43楼  回复 引用 查看   

    机器码:9be8db43c3-142e97ddf2-0000000000
    求解阅读码,谢谢!
    2011-12-05 11:36 | 痴人说梦      

    #44楼  回复 引用 查看   

    楼猪,确实来找骂的。
    2011-12-05 13:00 | mmmmmmm      

    #45楼  回复 引用 查看   

    学习了,顺便问哈,你是CAD中心老孙的学生嘛?
    2011-12-08 12:36 | KingZhong      

    #46楼  回复 引用 查看   

    机器码:5ebd269497-240e289ae3-0000000000
    求阅读密码,谢谢!
    2011-12-08 16:42 | fangmiya7258      

    #47楼  回复 引用 查看   

    我真的很像说句fuck 你不就是像勾起比人的欲望去买你的东西吗 你去街边发小广告不行了吗
    2011-12-09 14:59 | Faith_Ganler_lulu      

    #48楼  回复 引用 查看   

    机器码 c42f87f4d4-52496ffd79-0000000000

    求发阅读码
    2011-12-12 11:29 | pigonline      

    #49楼[楼主]  回复 引用 查看   

    @痴人说梦
    9d61c560f654b022d5
    2011-12-13 09:04 | 伍华聪      

    #50楼[楼主]  回复 引用 查看   

    引用fangmiya7258:
    机器码:5ebd269497-240e289ae3-0000000000
    求阅读密码,谢谢!

    9d669564a302b67287
    2011-12-13 09:04 | 伍华聪      

    #51楼[楼主]  回复 引用 查看   

    引用pigonline:
    机器码 c42f87f4d4-52496ffd79-0000000000

    求发阅读码

    9d63c736a456b42386
    2011-12-13 09:04 | 伍华聪      

    #52楼  回复 引用 查看   

    86260339@qq.com
    174b1564d8-3e337a695e-0000000000
    求发阅读码。万分感谢。。
    2011-12-13 15:06 | 86260339      

    #53楼  回复 引用 查看   

    174b1564d8-3e337a695e-0000000000
    大哥,求阅读码。一直在线等。。。万分感谢。。。
    2011-12-13 15:54 | 86260339      

    #54楼[楼主]  回复 引用 查看   

    引用86260339:
    174b1564d8-3e337a695e-0000000000
    大哥,求阅读码。一直在线等。。。万分感谢。。。

    9d679764f602e171d2
    2011-12-13 16:47 | 伍华聪      

    #55楼[楼主]  回复 引用 查看   

    @86260339
    9d679764f602e171d2
    2011-12-13 16:47 | 伍华聪      

    #56楼  回复 引用 查看   

    3d80450e6c-eaad7d0c5b-0000000000
    求阅读码 谢谢
    2011-12-15 00:43 | 北京—王志伟      

    #57楼  回复 引用 查看   

    1c629a022a-d41d8cd98f-0000000000
    求阅读码 谢谢
    2011-12-17 13:28 | ☆㊣惜梦㊣☆      

    #58楼  回复 引用 查看   

    一直在线等,等了一天多没结果,伤心ing
    2011-12-18 09:25 | ☆㊣惜梦㊣☆      

    #59楼[楼主]  回复 引用 查看   

    @北京—王志伟
    9d339030f657b07586
    2011-12-18 19:12 | 伍华聪      

    #60楼[楼主]  回复 引用 查看   

    @☆㊣惜梦㊣☆
    9d3bc636a55bb17085
    2011-12-18 19:12 | 伍华聪      

    #61楼  回复 引用 查看   

    唉,阅读码不对~,聪哥,能重新发个能用的阅读码吗?万分感谢1c629a022a-22f0b2f6f4-0000000000
    2011-12-21 21:21 | ☆㊣惜梦㊣☆      

    #62楼  回复 引用 查看   

    机器码 53c09a8456-a57dc9af26-0000000000

    求发阅读码

    非常感谢!!!
    2011-12-28 11:12 | vbhyc      

    #63楼  回复 引用 查看   

    大侠,发发慈悲吧!
    53c09a8456-a57dc9af26-0000000000
    2011-12-29 16:06 | vbhyc      

    #64楼  回复 引用 查看   

    win7下面打开显示此程序无法显示网页。。。有类似的吗?
    2011-12-30 16:28 | 86260339      

    #65楼[楼主]  回复 引用 查看   

    引用86260339:win7下面打开显示此程序无法显示网页。。。有类似的吗?

    我自己的系统就是Win7的,正常使用的
    你看看是不是安全性的问题
    2011-12-30 17:32 | 伍华聪      

    #66楼[楼主]  回复 引用 查看   

    @vbhyc
    9d30c235f505b62086
    2011-12-30 17:32 | 伍华聪      

    #67楼  回复 引用 查看   

    我的机器码是:a1069a970e-372e87f7b9-0000000000
    求发阅读码
    非常感谢!!!
    2012-01-18 17:38 | 顺流逆流      

    #68楼[楼主]  回复 引用 查看   

    @顺流逆流
    9d31c662a101b672d0
    2012-01-18 20:57 | 伍华聪      

    #69楼  回复 引用 查看   

    @伍华聪
    打开报错,弹出一个“Machine Debug Manager”的提示对话框 ,晕倒
    2012-01-19 14:15 | 顺流逆流      

    #70楼[楼主]  回复 引用 查看   

    @顺流逆流
    具体要跟踪下了,一般使用都没问题。
    2012-01-19 14:52 | 伍华聪      

    #71楼[楼主]  回复 引用 查看   

    阅读不了嘛?
    2012-01-19 14:52 | 伍华聪      

    #72楼  回复 引用 查看   

    @伍华聪
    哪就奇怪了啊,我用的是xp sp3,楼主能不能发一个没有加密的到我邮箱啊,我实在是打开出错,很苦恼……
    wulidi123@126.com
    谢谢楼主
    2012-01-21 22:33 | 顺流逆流      

    #73楼  回复 引用 查看   

    7555dea2ea-d41d8cd98f-0000000000
    求阅读码,谢谢啦,在线等
    2012-02-04 20:49 | 86260339      

    #74楼[楼主]  回复 引用 查看   

    9d639060f600b57387
    2012-02-05 09:42 | 伍华聪      

    #75楼  回复 引用 查看   

    谢谢。。。。
    2012-02-07 21:18 | 86260339      

    #76楼  回复 引用 查看   

    DataTableHelper里的ToDataTable碰到datetime类型会出错,希望楼主更新。网上早有相关代码
    2012-02-09 10:27 | 扶风父      

    导航

    <2011年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    公告

    昵称:伍华聪
    园龄:6年7个月
    荣誉:推荐博客
    粉丝:676
    关注:23

    搜索

     

    常用链接

    最新随笔

    我的标签

    随笔档案(202)

    文章分类(14)

    文章档案(15)

    相册

    我的好友

    我的技术支持站点(http://www.iqidi.com)

    积分与排名

    • 积分 - 629355
    • 排名 - 79

    最新评论

    阅读排行榜

    评论排行榜

    推荐排行榜