C# ObjectHelper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions; using Newtonsoft.Json;
using System.Web.Script.Serialization;
using System.Reflection;
using System.Security.Cryptography; namespace Utils
{
/// <summary>
/// 字符串<see cref="String"/>类型的扩展辅助操作类
/// </summary>
public static class ObjectHelper
{
#region 正则 /// <summary>
/// 指示所指定的正则表达式在指定的输入字符串中是否找到了匹配项
/// </summary>
/// <param name="value">要搜索匹配项的字符串</param>
/// <param name="pattern">要匹配的正则表达式模式</param>
/// <returns>如果正则表达式找到匹配项,则为 true;否则,为 false</returns>
public static bool IsMatch(this string value, string pattern)
{
if (value == null)
{
return false;
}
return Regex.IsMatch(value, pattern);
} /// <summary>
/// 在指定的输入字符串中搜索指定的正则表达式的第一个匹配项
/// </summary>
/// <param name="value">要搜索匹配项的字符串</param>
/// <param name="pattern">要匹配的正则表达式模式</param>
/// <returns>一个对象,包含有关匹配项的信息</returns>
public static string Match(this string value, string pattern)
{
if (value == null)
{
return null;
}
return Regex.Match(value, pattern).Value;
} /// <summary>
/// 在指定的输入字符串中搜索指定的正则表达式的所有匹配项的字符串集合
/// </summary>
/// <param name="value"> 要搜索匹配项的字符串 </param>
/// <param name="pattern"> 要匹配的正则表达式模式 </param>
/// <returns> 一个集合,包含有关匹配项的字符串值 </returns>
public static IEnumerable<string> Matches(this string value, string pattern)
{
if (value == null)
{
return new string[] { };
}
MatchCollection matches = Regex.Matches(value, pattern);
return from Match match in matches select match.Value;
} /// <summary>
/// 是否电子邮件
/// </summary>
public static bool IsEmail(this string value)
{
const string pattern = @"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$";
return value.IsMatch(pattern);
} /// <summary>
/// 是否是IP地址
/// </summary>
public static bool IsIpAddress(this string value)
{
const string pattern = @"^(\d(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\d\.){3}\d(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\d$";
return value.IsMatch(pattern);
} /// <summary>
/// 是否是整数
/// </summary>
public static bool IsNumeric(this string value)
{
const string pattern = @"^\-?[0-9]+$";
return value.IsMatch(pattern);
} /// <summary>
/// 是否是Unicode字符串
/// </summary>
public static bool IsUnicode(this string value)
{
const string pattern = @"^[\u4E00-\u9FA5\uE815-\uFA29]+$";
return value.IsMatch(pattern);
} /// <summary>
/// 是否Url字符串
/// </summary>
public static bool IsUrl(this string value)
{
const string pattern = @"^(http|https|ftp|rtsp|mms):(\/\/|\\\\)[A-Za-z0-9%\-_@]+\.[A-Za-z0-9%\-_@]+[A-Za-z0-9\.\/=\?%\-&_~`@:\+!;]*$";
return value.IsMatch(pattern);
} /// <summary>
/// 是否身份证号,验证如下3种情况:
/// 1.身份证号码为15位数字;
/// 2.身份证号码为18位数字;
/// 3.身份证号码为17位数字+1个字母
/// </summary>
public static bool IsIdentityCard(this string value)
{
const string pattern = @"^(^\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$";
return value.IsMatch(pattern);
} /// <summary>
/// 是否手机号码
/// </summary>
/// <param name="value"></param>
/// <param name="isRestrict">是否按严格格式验证</param>
public static bool IsMobileNumber(this string value, bool isRestrict = false)
{
string pattern = isRestrict ? @"^[1][3-8]\d{9}$" : @"^[1]\d{10}$";
return value.IsMatch(pattern);
} #endregion #region Json对象转换
/// <summary>
/// 把对象序列化成Json字符串格式
/// </summary>
/// <param name="object"></param>
/// <returns></returns>
public static string FromModelToJson(object @object)
{
// DoNet2.0 需要借助于Newtonsoft.Json.dll
string json = JsonConvert.SerializeObject(@object); //// Donet3.5自带了DLL处理json串
//StringBuilder stringBuilder = new StringBuilder();
//JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//jsonSerializer.Serialize(@object, stringBuilder);
//json = stringBuilder.ToString(); return JsonDateTimeFormat(json);
} /// <summary>
/// 将JSON字符串还原为对象
/// </summary>
/// <typeparam name="T">要转换的目标类型</typeparam>
/// <param name="json">JSON字符串 </param>
/// <returns></returns>
public static T FromJsonToModel<T>(string json)
{
json = JsonDateTimeFormat(json);
// DoNet2.0 需要借助于Newtonsoft.Json.dll
JavaScriptSerializer Serializer = new JavaScriptSerializer();
return Serializer.Deserialize<T>(json); //// Donet3.5自带了DLL处理json串
//JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//return jsonSerializer.Deserialize<T>(json);
} /// <summary>
/// 将JSON字符串还原为对象List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="JsonStr"></param>
/// <returns></returns>
public static List<T> JSONStringToList<T>(string JsonStr)
{
JavaScriptSerializer Serializer = new JavaScriptSerializer();
//设置转化JSON格式时字段长度
List<T> objs = Serializer.Deserialize<List<T>>(JsonStr);
return objs;
} /// <summary>
/// 处理Json的时间格式为正常格式
/// </summary>
public static string JsonDateTimeFormat(string json)
{
json = Regex.Replace(
json,
@"\\/Date\((\d+)\)\\/",
match =>
{
DateTime dt = new DateTime(, , );
dt = dt.AddMilliseconds(long.Parse(match.Groups[].Value));
dt = dt.ToLocalTime();
return dt.ToString("yyyy-MM-dd HH:mm:ss.fff");
});
return json;
}
#endregion #region Byte字符串转换 /// <summary>
/// 将字符串转换为<see cref="byte"/>[]数组,默认编码为<see cref="Encoding.UTF8"/>
/// </summary>
public static byte[] ToBytes(this string value, Encoding encoding = null)
{
if (encoding == null)
{
encoding = Encoding.UTF8;
}
return encoding.GetBytes(value);
} /// <summary>
/// 将<see cref="byte"/>[]数组转换为字符串,默认编码为<see cref="Encoding.UTF8"/>
/// </summary>
public static string ToString(this byte[] bytes, Encoding encoding = null)
{
if (encoding == null)
{
encoding = Encoding.UTF8;
}
return encoding.GetString(bytes);
} #endregion #region 合并分割截取
/// <summary>
/// 数组转字符串
/// </summary>
/// <param name="values"></param>
/// <param name="temp"></param>
/// <returns></returns>
public static string ArrayJoinToStr<T>(T[] values, string temp = ",")
{
return string.Join(temp, values);
} /// <summary>
/// 列表转字符串
/// </summary>
/// <param name="values"></param>
/// <param name="temp"></param>
/// <returns></returns>
public static string ListJoinToStr<T>(List<T> values, string temp = ",")
{
return string.Join(temp, values);
} /// <summary>
/// 以指定字符串作为分隔符将指定字符串分隔成数组
/// </summary>
/// <param name="value">要分割的字符串</param>
/// <param name="strSplit">字符串类型的分隔符</param>
/// <param name="removeEmptyEntries">是否移除数据中元素为空字符串的项</param>
/// <returns>分割后的数据</returns>
public static string[] Split(this string value, string strSplit, bool removeEmptyEntries = false)
{
return value.Split(new[] { strSplit }, removeEmptyEntries ? StringSplitOptions.RemoveEmptyEntries : StringSplitOptions.None);
} /// <summary>
/// 保留开头指定数量的字符串,结尾替换为指定字符
/// </summary>
/// <param name="str"></param>
/// <param name="num"></param>
/// <param name="temp"></param>
/// <returns></returns>
public static string GetStartStr(this string str, int num, string temp = "")
{
if (str != null)
{
if (str.Length > num)
{
str = str.Substring(, num);
if (!string.IsNullOrEmpty(temp))
return str + temp;
}
return str;
}
return "";
} /// <summary>
/// 截取结尾指定数量的字符串,结尾为指定字符
/// </summary>
/// <param name="str"></param>
/// <param name="num"></param>
/// <param name="temp"></param>
/// <returns></returns>
public static string ReplaceEndStr(this string str, int num, string temp = "")
{
if (str != null)
{
if (str.Length > num)
{
str = str.Substring(, str.Length - num);
if (!string.IsNullOrEmpty(temp))
return str + temp;
}
return str;
}
return "";
} /// <summary>
/// 保留结尾指定数量的字符串,开头替换为指定字符
/// </summary>
/// <param name="str"></param>
/// <param name="num"></param>
/// <param name="temp"></param>
/// <returns></returns>
public static string GetEndStr(this string str, int num, string temp = "")
{
string resStr = string.Empty;
if (str != null)
{
if (str.Length > num)
{
str = str.Substring(str.Length - num);
if (!string.IsNullOrEmpty(temp))
return temp + str;
}
return str;
}
return "";
} /// <summary>
/// 截取开头指定数量的字符串,开头替换为指定字符
/// </summary>
/// <param name="str"></param>
/// <param name="num"></param>
/// <param name="temp"></param>
/// <returns></returns>
public static string ReplaceStartStr(this string str, int num, string temp = "")
{
if (str != null)
{
if (str.Length > num)
{
str = str.Substring(num);
if (!string.IsNullOrEmpty(temp))
return temp + str;
}
return str;
}
return "";
} /// <summary>
/// 截取中间指定位置的字符,中间替换为指定字符
/// </summary>
/// <param name="str"></param>
/// <param name="num"></param>
/// <param name="temp"></param>
/// <returns></returns>
public static string ReplaceMidStr(this string str, int startNum, int endNum, string temp = "")
{
if (str != null)
{
if (str.Length > startNum && str.Length > endNum && startNum < endNum)
{
if (!string.IsNullOrEmpty(temp))
{
string s1 = str.Substring(, startNum);
string s2 = str.Substring(endNum);
return s1 + temp + s2;
}
else
return str.Remove(startNum, endNum - startNum);
}
return str;
}
return "";
} /// <summary>
/// 截取中间指定长度的字符,中间替换为指定字符
/// </summary>
/// <param name="str"></param>
/// <param name="num"></param>
/// <param name="temp"></param>
/// <returns></returns>
public static string ReplaceMidStrByLength(this string str, int startNum, int length, string temp = "")
{
if (str != null)
{
if (str.Length > startNum + length && length>)
{
if (!string.IsNullOrEmpty(temp))
{
string s1 = str.Substring(, startNum);
string s2 = str.Substring(length + length);
return s1 + temp + s2;
}
else
return str.Remove(startNum, length);
}
return str;
}
return "";
} #endregion #region 克隆对象
/// <summary>
/// 克隆对象
/// </summary>
/// <param name="o"></param>
/// <returns></returns>
public static object CloneObject(object o)
{
Type t = o.GetType();
PropertyInfo[] properties = t.GetProperties();
Object p = t.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, o, null);
foreach (PropertyInfo pi in properties)
{
if (pi.CanWrite)
{
object value = pi.GetValue(o, null);
pi.SetValue(p, value, null);
}
}
return p;
}
#endregion #region 唯一值
/// <summary>
/// 获取GUID唯一字符串
/// (js和sql中也可生成唯一标识)http://www.jb51.net/article/43823.htm
/// </summary>
/// <returns></returns>
public static string GetGuid()
{
return Guid.NewGuid().ToString();
} /// <summary>
/// 根据GUID获取16位的唯一字符串
/// </summary>
/// <param name=\"guid\"></param>
/// <returns></returns>
public static string GuidTo16String()
{
long i = ;
foreach (byte b in Guid.NewGuid().ToByteArray())
i *= ((int)b + );
return string.Format("{0:x}", i - DateTime.Now.Ticks);
} /// <summary>
/// 根据GUID获取唯一数字序列
/// </summary>
/// <returns></returns>
public static long GuidToLongID()
{
byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToInt64(buffer, );
} /// <summary>
/// 获取唯一字符串
/// 注:循环中连续取值是相同的
/// </summary>
/// <returns></returns>
public static string GetUniqueString()
{
Random rand = new Random();
return ((int)(rand.NextDouble() * )).ToString() + DateTime.Now.Ticks.ToString();
}
#endregion #region 字符过滤
/// <summary>
/// 删除所有的html标记
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ReplaceHtml(string str)
{
string[] Regexs =
{
@"<script[^>]*?>.*?</script>",
@"<(\/\s*)?!?((\w+:)?\w+)(\w+(\s*=?\s*(([""'])(\\[""'tbnr]|[^\7])*?\7|\w+)|.{0})|\s)*?(\/\s*)?>",
@"([\r\n])[\s]+",
@"&(quot|#34);",
@"&(amp|#38);",
@"&(lt|#60);",
@"&(gt|#62);",
@"&(nbsp|#160);",
@"&(iexcl|#161);",
@"&(cent|#162);",
@"&(pound|#163);",
@"&(copy|#169);",
@"&#(\d+);",
@"-->",
@"<!--.*\n"
}; string[] Replaces =
{
"",
"",
"",
"\"",
"&",
"<",
">",
" ",
"\xa1", //chr(161),
"\xa2", //chr(162),
"\xa3", //chr(163),
"\xa9", //chr(169),
"",
"\r\n",
""
}; string s = str;
for (int i = ; i < Regexs.Length; i++)
{
s = new Regex(Regexs[i], RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(s, Replaces[i]);
}
s.Replace("<", "");
s.Replace(">", "");
s.Replace("\r\n", "");
return s;
} /// <summary>
/// 删除所有的html元素
/// </summary>
/// <param name="html"></param>
/// <param name="length"></param>
/// <returns></returns>
public static string ReplaceHtmlEle(string html, int length = )
{
string strText = System.Text.RegularExpressions.Regex.Replace(html, "<[^>]+>", "");
strText = System.Text.RegularExpressions.Regex.Replace(strText, "&[^;]+;", ""); if (length > && strText.Length > length)
return strText.Substring(, length); return strText;
} /// <summary>
/// 过滤非法字符
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ReplaceBadChar(string str)
{
if (string.IsNullOrEmpty(str))
return "";
string strBadChar, tempChar;
string[] arrBadChar;
strBadChar = "@@,+,',--,%,^,&,?,(,),<,>,[,],{,},/,\\,;,:,\",\"\"";
arrBadChar = strBadChar.Split(',');
tempChar = str;
for (int i = ; i < arrBadChar.Length; i++)
{
if (arrBadChar[i].Length > )
tempChar = tempChar.Replace(arrBadChar[i], "");
}
return tempChar;
}
#endregion #region 时间
/// <summary>
/// 获取日期间隔
/// </summary>
/// <param name="dtStar"></param>
/// <param name="dtEnd"></param>
/// <returns></returns>
public static string GetTimeDelay(DateTime dtStar, DateTime dtEnd)
{
long lTicks = (dtEnd.Ticks - dtStar.Ticks) / ;
string sTemp = (lTicks / ).ToString().PadLeft(, '') + ":";
sTemp += ((lTicks % ) / ).ToString().PadLeft(, '') + ":";
sTemp += ((lTicks % ) % ).ToString().PadLeft(, ''); return sTemp;
} /// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static long GetTimeStamp(DateTime datetime)
{
var start = new DateTime(, , , , , , datetime.Kind);
return Convert.ToInt64((datetime - start).TotalSeconds);
} /// <summary>
/// 时间戳转为C#格式时间
/// </summary>
/// <param name="timeStamp">Unix时间戳格式</param>
/// <returns>C#格式时间</returns>
public static DateTime GetTime(long timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(, , ));
long lTime = long.Parse(timeStamp + "");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
}
#endregion #region 字符串加解密 /// <summary>
/// MD5 hash加密
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string MD5(string str, Encoding encoding = null)
{
if (encoding == null)
{
encoding = UnicodeEncoding.UTF8;
}
var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
var result = BitConverter.ToString(md5.ComputeHash(encoding.GetBytes(str.Trim())));
return result;
} /// <summary>
/// Base64加密
/// </summary>
/// <param name="str">待加密的明文</param>
/// <returns></returns>
public static string EncodeBase64(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
string result = Convert.ToBase64String(bytes);
return result;
} /// <summary>
/// Base64解密
/// </summary>
/// <param name="str">待解密的密文</param>
/// <returns></returns>
public static string DecodeBase64(string str)
{
byte[] bytes = Convert.FromBase64String(str);
string result = Encoding.UTF8.GetString(bytes);
return result;
} /// <summary>
/// 获取字符串的SHA1哈希值
/// </summary>
public static string GetSha1(string value)
{
StringBuilder sb = new StringBuilder();
SHA1Managed hash = new SHA1Managed();
byte[] bytes = hash.ComputeHash(Encoding.ASCII.GetBytes(value));
foreach (byte b in bytes)
{
sb.AppendFormat("{0:x2}", b);
}
return sb.ToString();
} /// <summary>
/// 获取字符串的Sha256哈希值
/// </summary>
public static string GetSha256(string value)
{
StringBuilder sb = new StringBuilder();
SHA256Managed hash = new SHA256Managed();
byte[] bytes = hash.ComputeHash(Encoding.ASCII.GetBytes(value));
foreach (byte b in bytes)
{
sb.AppendFormat("{0:x2}", b);
}
return sb.ToString();
} /// <summary>
/// 获取字符串的Sha512哈希值
/// </summary>
public static string GetSha512(string value)
{
StringBuilder sb = new StringBuilder();
SHA512Managed hash = new SHA512Managed();
byte[] bytes = hash.ComputeHash(Encoding.ASCII.GetBytes(value));
foreach (byte b in bytes)
{
sb.AppendFormat("{0:x2}", b);
}
return sb.ToString();
}
#endregion
}
}
C# ObjectHelper的更多相关文章
- C#记录对象的变化
经常,我们会遇到一个场景,在保存对象到数据库之前,对比内存对象和数据库值的差异. 下面我写了一种实现,为保存定义一个事件,然后自动找出对象之间的差异,请注意,并没有通过反射的方式去获取每个属性及其值. ...
- 不变(Invariant), 协变(Covarinat), 逆变(Contravariant) : 一个程序猿进化的故事
阿袁工作的第1天: 不变(Invariant), 协变(Covarinat), 逆变(Contravariant)的初次约 阿袁,早!开始工作吧. 阿袁在笔记上写下今天工作清单: 实现一个scala类 ...
- 【知识整理】这可能是最好的RxJava 2.x 教程(完结版)
为什么要学 RxJava? 提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨.近两年来国内的技术圈子中越来越多的开始提及 RxJava ,越来越多的应用和面试中都会有 RxJava ,而就目前的 ...
- FoxOne---一个快速高效的BS框架--数据访问(Dao)
FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...
- Javassist字节码增强示例
概述 Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果.熟练使用这套工具,可以让Java编程更接近与动态语言编程. 下面一个方 ...
- Android进阶:五、RxJava2源码解析 2
上一篇文章Android进阶:四.RxJava2 源码解析 1里我们讲到Rxjava2 从创建一个事件到事件被观察的过程原理,这篇文章我们讲Rxjava2中链式调用的原理.本文不讲用法,仍然需要读者熟 ...
- RxJava2 源码解析(二)
概述 承接上一篇RxJava2 源码解析(一),本系列我们的目的: 知道源头(Observable)是如何将数据发送出去的. 知道终点(Observer)是如何接收到数据的. 何时将源头和 ...
- RxJava2 源码分析
前言 很多项目使用流行的Rxjava2 + Retrofit搭建网络框架,Rxjava现在已经发展到Rxjava2,之前一直都只是再用Rxjava,但从来没有了解下Rxjava的内部实现,接下来一步步 ...
- 写个hello world了解Rxjava
目录 什么是Rxjava? 在微服务中的优点 上手使用 引入依赖 浅谈分析Rxjava中的被观察者,观察者 spring boot 项目中使用Rxjava2 什么是Rxjava? 来自百度百科的解释 ...
随机推荐
- 关于FragmentManager动态管理Fragment时Fragment生命周期的探究
Fragment是Android中的重要组件,在Android 3.0的时候添加进来. 关于Fragment的生命周期,我相信了解过的开发人员都应该把以下方法脱口而出:onAttach, onCrea ...
- Visual Studio 20**自动添加头部注释信息
关于Visual Studio 20**自动添加头部注释信息 作为一个万年潜水党,不关这一篇文章技术含量如何,也算是一个好的开始吧. 在日常的开发中我们经常需要为类库添加注释和版权等信息,这样 ...
- JavaScript中Null和Undefined的深渊
探索JavaScript中Null和Undefined的深渊 当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单 ...
- DOM事件简介
DOM事件简介--摘自ADMIN10000 Posted on 2013-12-05 09:32 ziran 阅读(76) 评论(1) 编辑 收藏 Click.touch.load.drag.chan ...
- Win 内存映射和堆栈
内存映射和堆栈 内存映射文件 内存映射文件可以用于3个不同的目的: 系统使用内存映射文件,以便加载和执行.exe和DLL文件.这可以大大节省页文件空间和应用程序启动运行所需的时间. 可以使用内存映射文 ...
- Hadoop能力测试图谱
一张图测试你的Hadoop能力-Hadoop能力测试图谱 1.引言 看到一张图,关于Hadoop技术框架的图,基本上涉及到Hadoop当前应用的主要领域,感觉可以作为测试Hadoop开发人员当前能力和 ...
- [转]Debugging the Mac OS X kernel with VMware and GDB
Source: http://ho.ax/posts/2012/02/debugging-the-mac-os-x-kernel-with-vmware-and-gdb/ Source: http:/ ...
- 如何将 Area 中的 Controller 放到独立的程序集?
目录 背景如何将 Area 中的 Controller 放到独立的程序集?备注 背景返回目录 本文假设您已经熟悉了 ASP.NET MVC 的常规开发方式.执行模型和关键扩展点,这里主要说一下如何使用 ...
- 《12个有趣的C语言问答》评析2
<12个有趣的C语言问答>评析(2) 前文链接:http://www.cnblogs.com/pmer/p/3313913.html (没存盘,遭遇过热保护.至少4个问答的评论白写了.默哀 ...
- 实现Launcher编辑模式(1) 壁纸更换
Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换 Posted on 2013-09-11 23:25 泡泡糖 阅读(212) 评论(3) 编辑 收藏 已 ...