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? 来自百度百科的解释 ...
随机推荐
- ASP.NET MVC之单元测试
ASP.NET MVC之单元测试分分钟的事2014-07-15 13:05 by 书洞里的猫, 550 阅读, 4 评论, 收藏, 编辑 一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在 ...
- Js模块模式
模块模式 索引 引子 什么是模块模式 命名空间模式 声明依赖 私有和特权成员 即时函数 揭示模块模式 结语 引子 这篇算是对第9篇中内容的发散和补充,当时我只是把模块模式中的一些内容简单的归为函数篇中 ...
- hadoop集群的搭建与配置(1)
前言 首先hadoop是在linux系统上进行搭建的,我们首先要在自己电脑上装上虚拟机然后装linux系统,因为我们是测试:在本地虚拟机上装两个linux分别搭建好hadoop ...
- noip模拟赛:部队[技巧?思想?]
王国军总指挥——卡西乌斯准将决定重建情报局,需要从全国各地挑选有能力的士兵,选择的标准为A,B两种能力.对于每个候选士兵,如果存在另一名士兵的两项能力均大于等于他,那么他将被淘汰.(注意:若两名士兵两 ...
- jquery 分页控件2
jquery 分页控件(二) 上一章主要是关于分页控件的原理,代码也没有重构.在这一章会附上小插件的下载链接,插件主要就是重构逻辑部分,具体可以下载源文件看下,源代码也有注释.为了测试这个插件是能用的 ...
- [置顶] 实现360度全景图像的利器--PanoramaGL
传送门 ☞轮子的专栏 ☞转载请注明 ☞ http://blog.csdn.net/leverage_1229 介绍 本指南将介绍一个PanoramaGL 0.1类库的简单用法,更多的细节请签出 Hel ...
- iOS UWebView详解
有时在项目中我们需要嵌入一些web相关的内容,这时你就要用到一个叫UIWebView的东西(UIWebView还可以打开一些文件等,如pdf等),在android和iOS中都有这个东西,使用起来也很方 ...
- 什么是Numpy的ndarray
什么是Numpy的ndarray 首先,Numpy的核心是ndarray. 然后,ndarray本质是数组,其不同于一般的数组,或者Python 的list的地方在于它可以有N 维(dimention ...
- 写20万数据到Excel只需9秒
on my god,写20万数据到Excel只需9秒 还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万条以上,最初采用的方式就是在服务器端用NPOI生成E ...
- PHP5.3 里面数组的的实现方式
typedef struct _Bucket { char *key; void *value; struct _Bucket *next; } Bucket; typedef struct _Has ...