using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Xml; using System.Xml.Linq; namespace WIDESEA_Core.Extensions { public static class ObjectExtension { public static bool DicKeyIsNullOrEmpty(this Dictionary<string, object> dic, string key) { if (dic == null) return true; if (!dic.ContainsKey(key)) return true; object value = dic[key]; if (value == null || value.ToString() == "") { return true; } return false; } public static Dictionary<string, object> ReaderToDictionary(this IDataReader Reader) { List<Dictionary<string, object>> rowList = Reader.ReaderToDictionaryList(); return rowList.Count() > 0 ? rowList[0] : null; } /// <summary> /// IDataReaderè½¬æ¢æˆDictionaryList /// </summary> /// <param name="Reader"></param> /// <returns></returns> public static List<Dictionary<string, object>> ReaderToDictionaryList(this IDataReader Reader) { List<Dictionary<string, object>> rowList = new List<Dictionary<string, object>>(); try { while (Reader.Read()) { Dictionary<string, object> row = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); for (var fieldCount = 0; fieldCount < Reader.FieldCount; fieldCount++) { row.Add(Reader.GetName(fieldCount), Reader[fieldCount]); } rowList.Add(row); } } catch (Exception ex) { throw ex; } finally { Reader.Close(); Reader.Dispose(); } return rowList; } public static T DicToEntity<T>(this Dictionary<string, object> dic) { return new List<Dictionary<string, object>>() { dic }.DicToList<T>().ToList()[0]; } public static List<T> DicToList<T>(this List<Dictionary<string, object>> dicList) { return dicList.DicToIEnumerable<T>().ToList(); } public static object DicToList(this List<Dictionary<string, object>> dicList, Type type) { return typeof(ObjectExtension).GetMethod("DicToList") .MakeGenericMethod(new Type[] { type }) .Invoke(typeof(ObjectExtension), new object[] { dicList }); } public static IEnumerable<T> DicToIEnumerable<T>(this List<Dictionary<string, object>> dicList) { foreach (Dictionary<string, object> dic in dicList) { T model = Activator.CreateInstance<T>(); foreach (PropertyInfo property in model.GetType() .GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance)) { if (!dic.TryGetValue(property.Name, out object value)) continue; property.SetValue(model, value?.ToString().ChangeType(property.PropertyType), null); } yield return model; } } /// <summary> /// IDataReaderè½¬æ¢æˆList /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Reader"></param> /// <returns></returns> public static List<T> ReaderToList<T>(this IDataReader Reader) { List<string> objectField = new List<string>(Reader.FieldCount); for (int i = 0; i < Reader.FieldCount; i++) { objectField.Add(Reader.GetName(i).ToLower()); } List<T> objectList = new List<T>(); try { while (Reader.Read()) { T model = Activator.CreateInstance<T>(); foreach (PropertyInfo property in model.GetType() .GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance)) { if (!objectField.Contains(property.Name.ToLower())) { continue; } if (Reader[property.Name].IsNullOrEmpty()) { continue; } property.SetValue(model, Reader[property.Name].ToString().ChangeType(property.PropertyType), null); } objectList.Add(model); } } catch (Exception ex) { throw ex; } finally { Reader.Close(); Reader.Dispose(); } return objectList; } public static object ChangeType(this object convertibleValue, Type type) { if (null == convertibleValue) return null; try { if (type == typeof(Guid) || type == typeof(Guid?)) { string value = convertibleValue.ToString(); if (value == "") return null; return Guid.Parse(value); } if (!type.IsGenericType) return Convert.ChangeType(convertibleValue, type); if (type.ToString() == "System.Nullable`1[System.Boolean]" || type.ToString() == "System.Boolean") { if (convertibleValue.ToString() == "0") return false; return true; } Type genericTypeDefinition = type.GetGenericTypeDefinition(); if (genericTypeDefinition == typeof(Nullable<>)) { return Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(type)); } } catch { return null; } return null; } /// <summary> /// 将集åˆè½¬æ¢ä¸ºæ•°æ®é›†ã€‚ /// </summary> /// <typeparam name="T">转æ¢çš„å…ƒç´ ç±»åž‹ã€‚</typeparam> /// <param name="list">集åˆã€‚</param> /// <param name="generic">是å¦ç”Ÿæˆæ³›åž‹æ•°æ®é›†ã€‚</param> /// <returns>æ•°æ®é›†ã€‚</returns> public static DataSet ToDataSet<T>(this IEnumerable<T> list, bool generic = true) { return ListToDataSet(list, generic); } /// <summary> /// 将集åˆè½¬æ¢ä¸ºæ•°æ®é›†ã€‚ /// </summary> /// <param name="list">集åˆã€‚</param> /// <param name="generic">是å¦ç”Ÿæˆæ³›åž‹æ•°æ®é›†ã€‚</param> /// <returns>æ•°æ®é›†ã€‚</returns> public static DataSet ToDataSet(this IEnumerable list, bool generic = true) { return ListToDataSet(list, generic); } /// <summary> /// 将集åˆè½¬æ¢ä¸ºæ•°æ®é›†ã€‚ /// </summary> /// <typeparam name="T">转æ¢çš„å…ƒç´ ç±»åž‹ã€‚</typeparam> /// <param name="list">集åˆã€‚</param> /// <param name="generic">是å¦ç”Ÿæˆæ³›åž‹æ•°æ®é›†ã€‚</param> /// <returns>æ•°æ®é›†ã€‚</returns> public static DataSet ToDataSet<T>(this IEnumerable list, bool generic = true) { return ListToDataSet(list, typeof(T), generic); } /// <summary> /// 将实例转æ¢ä¸ºé›†åˆæ•°æ®é›†ã€‚ /// </summary> /// <typeparam name="T">实例类型。</typeparam> /// <param name="o">实例。</param> /// <param name="generic">是å¦ç”Ÿæˆæ³›åž‹æ•°æ®é›†ã€‚</param> /// <returns>æ•°æ®é›†ã€‚</returns> public static DataSet ToListSet<T>(this T o, bool generic = true) { if (o is IEnumerable) { return ListToDataSet(o as IEnumerable, generic); } else { return ListToDataSet(new T[] { o }, generic); } } /// <summary> /// å°†å¯åºåˆ—化实例转æ¢ä¸ºXmlDocument。 /// </summary> /// <typeparam name="T">实例类型。</typeparam> /// <param name="o">实例。</param> /// <returns>XmlDocument。</returns> public static XmlDocument ToXmlDocument<T>(this T o) { XmlDocument xmlDocument = new XmlDocument { InnerXml = o.ToListSet().GetXml() }; return xmlDocument; } /// <summary> /// 将集åˆè½¬æ¢ä¸ºæ•°æ®é›†ã€‚ /// </summary> /// <param name="list">集åˆã€‚</param> /// <param name="t">转æ¢çš„å…ƒç´ ç±»åž‹ã€‚</param> /// <param name="generic">是å¦ç”Ÿæˆæ³›åž‹æ•°æ®é›†ã€‚</param> /// <returns>转æ¢åŽçš„æ•°æ®é›†ã€‚</returns> private static DataSet ListToDataSet(IEnumerable list, Type t, bool generic) { DataSet ds = new DataSet("Data"); if (t == null) { if (list != null) { foreach (var i in list) { if (i == null) { continue; } t = i.GetType(); break; } } if (t == null) { return ds; } } ds.Tables.Add(t.Name); //如果集åˆä¸å…ƒç´ 为DataSet扩展涉åŠåˆ°çš„基本类型时,进行特殊转æ¢ã€‚ if (t.IsValueType || t == typeof(string)) { ds.Tables[0].TableName = "Info"; ds.Tables[0].Columns.Add(t.Name); if (list != null) { foreach (var i in list) { DataRow addRow = ds.Tables[0].NewRow(); addRow[t.Name] = i; ds.Tables[0].Rows.Add(addRow); } } return ds; } //å¤„ç†æ¨¡åž‹çš„å—æ®µå’Œå±žæ€§ã€‚ var fields = t.GetFields(); var properties = t.GetProperties(); foreach (var j in fields) { if (!ds.Tables[0].Columns.Contains(j.Name)) { if (generic) { ds.Tables[0].Columns.Add(j.Name, j.FieldType); } else { ds.Tables[0].Columns.Add(j.Name); } } } foreach (var j in properties) { if (!ds.Tables[0].Columns.Contains(j.Name)) { if (generic) { ds.Tables[0].Columns.Add(j.Name, j.PropertyType); } else { ds.Tables[0].Columns.Add(j.Name); } } } if (list == null) { return ds; } //读å–listä¸å…ƒç´ 的值。 foreach (var i in list) { if (i == null) { continue; } DataRow addRow = ds.Tables[0].NewRow(); foreach (var j in fields) { MemberExpression field = Expression.Field(Expression.Constant(i), j.Name); LambdaExpression lambda = Expression.Lambda(field, new ParameterExpression[] { }); Delegate func = lambda.Compile(); object value = func.DynamicInvoke(); addRow[j.Name] = value; } foreach (var j in properties) { MemberExpression property = Expression.Property(Expression.Constant(i), j); LambdaExpression lambda = Expression.Lambda(property, new ParameterExpression[] { }); Delegate func = lambda.Compile(); object value = func.DynamicInvoke(); addRow[j.Name] = value; } ds.Tables[0].Rows.Add(addRow); } return ds; } /// <summary> /// 将集åˆè½¬æ¢ä¸ºæ•°æ®é›†ã€‚ /// </summary> /// <typeparam name="T">转æ¢çš„å…ƒç´ ç±»åž‹ã€‚</typeparam> /// <param name="list">集åˆã€‚</param> /// <param name="generic">是å¦ç”Ÿæˆæ³›åž‹æ•°æ®é›†ã€‚</param> /// <returns>æ•°æ®é›†ã€‚</returns> private static DataSet ListToDataSet<T>(IEnumerable<T> list, bool generic) { return ListToDataSet(list, typeof(T), generic); } /// <summary> /// 将集åˆè½¬æ¢ä¸ºæ•°æ®é›†ã€‚ /// </summary> /// <param name="list">集åˆã€‚</param> /// <param name="generic">是å¦è½¬æ¢ä¸ºå—符串形å¼ã€‚</param> /// <returns>转æ¢åŽçš„æ•°æ®é›†ã€‚</returns> private static DataSet ListToDataSet(IEnumerable list, bool generic) { return ListToDataSet(list, null, generic); } /// <summary> /// 获å–DataSet第一表,第一行,第一列的值。 /// </summary> /// <param name="ds">DataSetæ•°æ®é›†ã€‚</param> /// <returns>值。</returns> public static object GetData(this DataSet ds) { if ( ds == null || ds.Tables.Count == 0 ) { return string.Empty; } else { return ds.Tables[0].GetData(); } } /// <summary> /// 获å–DataTable第一行,第一列的值。 /// </summary> /// <param name="dt">DataTableæ•°æ®é›†è¡¨ã€‚</param> /// <returns>值。</returns> public static object GetData(this DataTable dt) { if ( dt.Columns.Count == 0 || dt.Rows.Count == 0 ) { return string.Empty; } else { return dt.Rows[0][0]; } } /// <summary> /// 获å–DataSet第一个匹é…columnName的值。 /// </summary> /// <param name="ds">æ•°æ®é›†ã€‚</param> /// <param name="columnName">列å。</param> /// <returns>值。</returns> public static object GetData(this DataSet ds, string columnName) { if ( ds == null || ds.Tables.Count == 0 ) { return string.Empty; } foreach (DataTable dt in ds.Tables) { object o = dt.GetData(columnName); if (!string.IsNullOrEmpty(o.ToString())) { return o; } } return string.Empty; } /// <summary> /// 获å–DataTable第一个匹é…columnName的值。 /// </summary> /// <param name="dt">æ•°æ®è¡¨ã€‚</param> /// <param name="columnName">列å。</param> /// <returns>值。</returns> public static object GetData(this DataTable dt, string columnName) { if (string.IsNullOrEmpty(columnName)) { return GetData(dt); } if ( dt.Columns.Count == 0 || dt.Columns.IndexOf(columnName) == -1 || dt.Rows.Count == 0 ) { return string.Empty; } return dt.Rows[0][columnName]; } /// <summary> /// å°†object转æ¢ä¸ºstring类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>string。</returns> public static string ToString(this object o, string t) { string info = string.Empty; if (o == null) { info = t; } else { info = o.ToString(); } return info; } /// <summary> /// å°†DateTime?转æ¢ä¸ºstring类型信æ¯ã€‚ /// </summary> /// <param name="o">DateTime?。</param> /// <param name="format">æ ‡å‡†æˆ–è‡ªå®šä¹‰æ—¥æœŸå’Œæ—¶é—´æ ¼å¼çš„å—符串。</param> /// <param name="t">默认值。</param> /// <returns>string。</returns> public static string ToString(this DateTime? o, string format, string t) { string info = string.Empty; if (o == null) { info = t; } else { info = o.Value.ToString(format); } return info; } /// <summary> /// å°†TimeSpan?转æ¢ä¸ºstring类型信æ¯ã€‚ /// </summary> /// <param name="o">TimeSpan?。</param> /// <param name="format">æ ‡å‡†æˆ–è‡ªå®šä¹‰æ—¶é—´æ ¼å¼çš„å—符串。</param> /// <param name="t">默认值。</param> /// <returns>string。</returns> public static string ToString(this TimeSpan? o, string format, string t) { string info = string.Empty; if (o == null) { info = t; } else { info = o.Value.ToString(format); } return info; } /// <summary> /// å°†object转æ¢ä¸ºbyte类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>byte。</returns> public static byte ToByte(this object o, byte t = default(byte)) { if (!byte.TryParse(o.ToString(string.Empty), out byte info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºint类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>int。</returns> public static int ToInt(this object o, int t = default(int)) { if (!int.TryParse(o.ToString(string.Empty), out int info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºdouble类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>double。</returns> public static double ToDouble(this object o, double t = default(double)) { double info; if (!double.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºdecimal类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>decimal。</returns> public static decimal ToDecimal(this object o, decimal t = default(decimal)) { decimal info; if (!decimal.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºfloat类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>float。</returns> public static float ToFloat(this object o, float t = default(float)) { if (!float.TryParse(o.ToString(string.Empty), out float info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºlong类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>long。</returns> public static long ToLong(this object o, long t = default(long)) { long info; if (!long.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºbool类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>bool。</returns> public static bool ToBool(this object o, bool t = default(bool)) { bool info; if (!bool.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºsbyte类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>sbyte。</returns> public static sbyte ToSbyte(this object o, sbyte t = default(sbyte)) { sbyte info; if (!sbyte.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºshort类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>short。</returns> public static short ToShort(this object o, short t = default(short)) { short info; if (!short.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºushort类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>ushort。</returns> public static ushort ToUShort(this object o, ushort t = default(ushort)) { ushort info; if (!ushort.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºulong类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>ulong。</returns> public static ulong ToULong(this object o, ulong t = default(ulong)) { ulong info; if (!ulong.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºEnum[T]类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>Enum[T]。</returns> public static T ToEnum<T>(this object o, T t = default(T)) where T : struct { if (!System.Enum.TryParse(o.ToString(string.Empty), out T info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºDateTime类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>DateTime。</returns> public static DateTime ToDateTime(this object o, DateTime t = default(DateTime)) { if (t == default(DateTime)) { t = new DateTime(1753, 1, 1); } DateTime info; if (!DateTime.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºTimeSpan类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>TimeSpan。</returns> public static TimeSpan ToTimeSpan(this object o, TimeSpan t = default(TimeSpan)) { if (t == default(TimeSpan)) { t = new TimeSpan(0, 0, 0); } TimeSpan info; if (!TimeSpan.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } /// <summary> /// å°†object转æ¢ä¸ºGuid类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>Guid。</returns> public static Guid ToGuid(this object o, Guid t = default(Guid)) { Guid info; if (!Guid.TryParse(o.ToString(string.Empty), out info)) { info = t; } return info; } private static Regex BoolRegex = new Regex("(?<info>(true|false))", RegexOptions.IgnoreCase | RegexOptions.Singleline); /// <summary> /// 从objectä¸èŽ·å–bool类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <returns>bool。</returns> public static bool GetBool(this string value) { bool.TryParse(value, out bool result); return result; } private static Regex IntRegex = new Regex("(?<info>-?\\d+)", RegexOptions.IgnoreCase | RegexOptions.Singleline); private static Regex DecimalRegex = new Regex("(?<info>-?\\d+(\\.\\d+)?)", RegexOptions.IgnoreCase | RegexOptions.Singleline); /// <summary> /// 从objectä¸èŽ·å–decimal类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <returns>decimal。</returns> public static decimal? GetDecimal(this object o) { decimal info; if (!decimal.TryParse(DecimalRegex.Match(o.ToString(string.Empty)).Groups["info"].Value, out info)) { return null; } return info; } /// <summary> /// 从objectä¸èŽ·å–æ£æ•°ä¿¡æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <returns>decimal。</returns> public static decimal? GetPositiveNumber(this object o) { decimal info; if (!decimal.TryParse(DecimalRegex.Match(o.ToString(string.Empty)).Groups["info"].Value, out info)) { return null; } return Math.Abs(info); } private static Regex DateTimeRegex = new Regex("(?<info>(((\\d+)[/å¹´-](0?[13578]|1[02])[/月-](3[01]|[12]\\d|0?\\d)[æ—¥]?)|((\\d+)[/å¹´-](0?[469]|11)[/月-](30|[12]\\d|0?\\d)[æ—¥]?)|((\\d+)[/å¹´-]0?2[/月-](2[0-8]|1\\d|0?\\d)[æ—¥]?))(\\s((2[0-3]|[0-1]\\d)):[0-5]\\d:[0-5]\\d)?)", RegexOptions.IgnoreCase | RegexOptions.Singleline); /// <summary> /// 从objectä¸èŽ·å–DateTime?类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <returns>DateTime?。</returns> public static DateTime? GetDateTime1(this object o) { DateTime info; if (!DateTime.TryParse(DateTimeRegex.Match(o.ToString(string.Empty)).Groups["info"].Value.Replace("å¹´", "-").Replace("月", "-").Replace("/", "-").Replace("æ—¥", ""), out info)) { return null; } return info; } private static Regex TimeSpanRegex = new Regex("(?<info>-?(\\d+\\.(([0-1]\\d)|(2[0-3])):[0-5]\\d:[0-5]\\d)|((([0-1]\\d)|(2[0-3])):[0-5]\\d:[0-5]\\d)|(\\d+))", RegexOptions.IgnoreCase | RegexOptions.Singleline); /// <summary> /// 从objectä¸èŽ·å–TimeSpan?类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <returns>TimeSpan?。</returns> public static TimeSpan? GetTimeSpan(this object o) { TimeSpan info; if (!TimeSpan.TryParse(TimeSpanRegex.Match(o.ToString(string.Empty)).Groups["info"].Value, out info)) { return null; } return info; } private static Regex GuidRegex = new Regex("(?<info>\\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\\}{0,1})", RegexOptions.IgnoreCase | RegexOptions.Singleline); /// <summary> /// 从objectä¸èŽ·å–Guid?类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <returns>Guid?。</returns> public static Guid? GetGuid(this object o) { Guid info; if (!Guid.TryParse(GuidRegex.Match(o.ToString(string.Empty)).Groups["info"].Value, out info)) { return null; } return info; } /// <summary> /// å°†object转æ¢ä¸ºSqlServerä¸çš„DateTime?类型信æ¯ã€‚ /// </summary> /// <param name="o">object。</param> /// <param name="t">默认值。</param> /// <returns>DateTime?。</returns> public static DateTime? GetSqlDateTime(this object o, DateTime t = default(DateTime)) { DateTime info; if (!DateTime.TryParse(o.ToString(string.Empty), out info)) { info = t; } if (info < new DateTime(1753, 1, 1) || info > new DateTime(9999, 12, 31)) { return null; } return info; } /// <summary> /// 读å–XElement节点的文本内容。 /// </summary> /// <param name="xElement">XElement节点。</param> /// <param name="t">默认值。</param> /// <returns>文本内容。</returns> public static string Value(this XElement xElement, string t = default(string)) { if (xElement == null) { return t; } else { return xElement.Value; } } /// <summary> /// 获å–与指定键相关的值。 /// </summary> /// <typeparam name="TKey">键类型。</typeparam> /// <typeparam name="TValue">值类型。</typeparam> /// <param name="dictionary">表示键/值对象的泛型集åˆã€‚</param> /// <param name="key">键。</param> /// <param name="t">默认值。</param> /// <returns>值。</returns> public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue t = default(TValue)) { TValue value = default(TValue); if (dictionary == null || key == null) { return t; } if (!dictionary.TryGetValue(key, out value)) { value = t; } return value; } /// <summary> /// 获å–与指定键相关或者第一个的值。 /// </summary> /// <typeparam name="TKey">键类型。</typeparam> /// <typeparam name="TValue">值类型。</typeparam> /// <param name="dictionary">表示键/值对象的泛型集åˆã€‚</param> /// <param name="key">键。</param> /// <param name="t">默认值。</param> /// <returns>值。</returns> public static TValue GetFirstOrDefaultValue<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue t = default(TValue)) { TValue value = default(TValue); if (dictionary == null || key == null) { return t; } if (!dictionary.TryGetValue(key, out value)) { if (dictionary.Count() == 0) { value = t; } else { value = dictionary.FirstOrDefault().Value; } } return value; } /// <summary> /// 获å–具有指定 System.Xml.Linq.XName 的第一个(按文档顺åºï¼‰åå…ƒç´ ã€‚ /// </summary> /// <param name="xContainer">XContainer。</param> /// <param name="xName">è¦åŒ¹é…çš„ System.Xml.Linq.XName。</param> /// <param name="t">是å¦è¿”回åŒå默认值。</param> /// <returns>与指定 System.Xml.Linq.XName 匹é…çš„ System.Xml.Linq.XElement,或者为 null。</returns> public static XElement Element(this XContainer xContainer, XName xName, bool t) { XElement info; if (xContainer == null) { info = null; } else { info = xContainer.Element(xName); } if (t && info == null) { info = new XElement(xName); } return info; } /// <summary> /// 按文档顺åºè¿”回æ¤å…ƒç´ 或文档的åå…ƒç´ é›†åˆã€‚ /// </summary> /// <param name="xContainer">XContainer。</param> /// <param name="t">是å¦è¿”回éžç©ºé»˜è®¤å€¼ã€‚</param> /// <returns>System.Xml.Linq.XElement 的按文档顺åºåŒ…嫿¤System.Xml.Linq.XContainer çš„åå…ƒç´ ï¼Œæˆ–è€…éžç©ºé»˜è®¤å€¼ã€‚</returns> public static IEnumerable<XElement> Elements(this XContainer xContainer, bool t) { IEnumerable<XElement> info; if (xContainer == null) { info = null; } else { info = xContainer.Elements(); } if (t && info == null) { info = new List<XElement>(); } return info; } /// <summary> /// 按文档顺åºè¿”回æ¤å…ƒç´ 或文档的ç»è¿‡ç›é€‰çš„åå…ƒç´ é›†åˆã€‚集åˆä¸åªåŒ…æ‹¬å…·æœ‰åŒ¹é… System.Xml.Linq.XName çš„å…ƒç´ ã€‚ /// </summary> /// <param name="xContainer">XContainer。</param> /// <param name="xName">è¦åŒ¹é…çš„ System.Xml.Linq.XName。</param> /// <param name="t">是å¦è¿”回éžç©ºé»˜è®¤å€¼ã€‚</param> /// <returns>System.Xml.Linq.XElement 的按文档顺åºåŒ…å«å…·æœ‰åŒ¹é…System.Xml.Linq.XName çš„ System.Xml.Linq.XContainer çš„å级,或者éžç©ºé»˜è®¤å€¼ã€‚</returns> public static IEnumerable<XElement> Elements(this XContainer xContainer, XName xName, bool t) { IEnumerable<XElement> info; if (xContainer == null) { info = null; } else { info = xContainer.Elements(xName); } if (t && info == null) { info = new List<XElement>(); } return info; } /// <summary> /// åˆ é™¤htmlæ ‡ç¾ã€‚ /// </summary> /// <param name="html">输入的å—符串。</param> /// <returns>没有htmlæ ‡ç¾çš„å—符串。</returns> public static string RemoveHTMLTags(this string html) { return Regex.Replace(Regex.Replace(Regex.Replace((html ?? string.Empty).Replace(" ", " ").Replace("\r\n", " ").Replace("\n", " ").Replace("\r", " ").Replace("\t", " "), "<\\/?[^>]+>", "\r\n"), "(\r\n)+", "\r\n"), "(\\s)+", " ").Trim(); } /// <summary> /// å—符串转æ¢ä¸ºæ–‡ä»¶å。 /// </summary> /// <param name="s">å—符串。</param> /// <returns>文件å。</returns> public static string ToFileName(this string s) { return Regex.Replace(s.ToString(string.Empty), @"[\\/:*?<>|]", "_").Replace("\t", " ").Replace("\r\n", " ").Replace("\"", " "); } /// <summary> /// 获å–默认éžç©ºå—符串。 /// </summary> /// <param name="s">首选默认éžç©ºå—符串。</param> /// <param name="args">便¬¡éžç©ºå—符串å¯é€‰é¡¹ã€‚</param> /// <returns>默认éžç©ºå—ç¬¦ä¸²ã€‚è‹¥æ— å¯é€‰é¡¹åˆ™è¿”回string.Empty。</returns> public static string DefaultStringIfEmpty(this string s, params string[] args) { if (string.IsNullOrEmpty(s)) { return string.Empty; } foreach (string i in args) { if (!string.IsNullOrEmpty(i) && !string.IsNullOrEmpty(i.Trim())) { return i; } } return (s ?? string.Empty); } /// <summary> /// 对 URL å—符串进行编ç 。 /// </summary> /// <param name="s">è¦ç¼–ç 的文本。</param> /// <param name="regex">匹é…è¦ç¼–ç 的文本。</param> /// <param name="encoding">æŒ‡å®šç¼–ç æ–¹æ¡ˆçš„ System.Text.Encoding 对象。</param> /// <returns>一个已编ç çš„å—符串。</returns> public static string ToUrlEncodeString(this string s, Regex regex = default(Regex), Encoding encoding = null) { if (encoding == null) { encoding = Encoding.UTF8; } if (regex == null) { return HttpUtility.UrlEncode(s, encoding); } List<string> l = new List<string>(); foreach (char i in s) { string t = i.ToString(); l.Add(regex.IsMatch(t) ? HttpUtility.UrlEncode(t, encoding) : t); } return string.Join(string.Empty, l); } /// <summary> /// 对 URL å—符串进行编ç 。 /// </summary> /// <param name="s">è¦ç¼–ç 的文本。</param> /// <param name="regex">匹é…è¦ç¼–ç 的文本。</param> /// <param name="encoding">æŒ‡å®šç¼–ç æ–¹æ¡ˆçš„ System.Text.Encoding 对象。</param> /// <returns>一个已编ç çš„å—符串。</returns> public static string ToUrlEncodeString(this string s, string regex, Encoding encoding = null) { return ToUrlEncodeString(s, new Regex(regex), encoding); } /// <summary> /// 将日期转æ¢ä¸ºUNIX时间戳å—符串 /// </summary> /// <param name="date"></param> /// <returns></returns> public static string ToUnixTimeStamp(this DateTime date) { DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1)); string timeStamp = date.Subtract(startTime).Ticks.ToString(); return timeStamp.Substring(0, timeStamp.Length - 7); } private static readonly Regex MobileRegex = new Regex("^1[3-9][0-9]\\d{4,8}$"); private static readonly Regex EmailRegex = new Regex("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$"); /// <summary> /// 判æ–当å‰å—ç¬¦ä¸²æ˜¯å¦æ˜¯ç§»åŠ¨ç”µè¯å·ç /// </summary> /// <param name="mobile"></param> /// <returns></returns> public static bool IsMobile(this string mobile) { return MobileRegex.IsMatch(mobile); } /// <summary> /// 判æ–当å‰å—符串是å¦ä¸ºé‚®ç®± /// </summary> /// <param name="email"></param> /// <returns></returns> public static bool IsEmail(this string email) { return EmailRegex.IsMatch(email); } } /// <summary> /// æ ‡è®°ã€‚ /// </summary> public enum Flag { /// <summary> /// 默认。 /// </summary> Default, /// <summary> /// 真。 /// </summary> True, /// <summary> /// å‡ã€‚ /// </summary> False } }