using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Serialization; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Web; using System.Xml; using AutoMapper; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using xCommons.Constants; using xCommons.Helpers; using xExceptions.Attributes; using xExceptions.Constants; namespace xCommons.Extensions { public static partial class CommonExtensions { /// /// Conert XMLNode to String ... /// /// /// /// public static string ToString (this XmlNode node, int indentation = 2) { // using (var sw = new StringWriter ()) { // using (var xw = new XmlTextWriter (sw)) { xw.Formatting = System.Xml.Formatting.Indented; xw.Indentation = indentation; node.WriteContentTo (xw); } // return sw.ToString (); } } /// /// Converts a Json String to Dictionary of String Mappings /// /// Json String /// public static Dictionary JSONToDictionary (this string source) { // try { return JsonConvert.DeserializeObject> (source); } catch { return null; } } /// /// Convert properties of specific Class instance to Dictionary ... /// /// class instance /// public static Dictionary ToDictionary (this T source) where T : class { // var result = new Dictionary (); // if (source.IsNull ()) { return result; } // PropertyInfo[] propertyInfos = source.GetType ().GetProperties (); if (!propertyInfos.HasChild ()) { return result; } // foreach (PropertyInfo propertyInfo in propertyInfos) { result.Add ( propertyInfo.Name, propertyInfo .GetValue (source, null) .ToString () ); } // return result; } /// /// run specific task and retrieve result ... /// /// public static void RunTask (this Task source) { source. GetAwaiter () .GetResult (); } /// /// run specific task and retrieve result ... /// /// public static T RunTask (this Task source) { return source. GetAwaiter () .GetResult (); } /// /// Convert XML String to Json Object ... /// /// /// public static string ToJSON (this string source) { // var result = string.Empty; try { // result = XMLToJSONHelper.ToJSON (source); // // Handle Removing Additional Values ... result = result.Replace ("s:", "").Replace ("a:", ""); } catch { } // return result; } /// /// Convert object to Json ... /// /// /// public static string ToJSON (this T value) where T : class { // if (value.IsNull ()) { return string.Empty; } // var setting = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, PreserveReferencesHandling = PreserveReferencesHandling.None }; // return JsonConvert.SerializeObject (value, Newtonsoft.Json.Formatting.None, setting); } /// /// Convert to Json With Support of Camel Casing /// /// /// /// public static string ToJSON (this T value, bool camelCase = false) { // if (value.IsNull ()) { return string.Empty; } // var setting = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, PreserveReferencesHandling = PreserveReferencesHandling.None, }; // if (camelCase) { setting.ContractResolver = new CamelCasePropertyNamesContractResolver (); } // return JsonConvert.SerializeObject (value, Newtonsoft.Json.Formatting.None, setting); } /// /// Map to Dynamic Object ... /// /// /// public static dynamic ToDynamicObject (this string source) { return JsonConvert.DeserializeObject (source); } /// /// Map to Dynamic Object ... /// /// /// public static dynamic ToDynamicObject (this object source) { // var dMapConfig = new MapperConfiguration (b => { }); var dMapper = dMapConfig.CreateMapper (); // return dMapper.Map (source); } /// /// Parse From Dynamic Object ... /// /// /// /// public static T FromDynamicObject (this object source) where T : class { // var dMapConfig = new MapperConfiguration (b => { }); var dMapper = dMapConfig.CreateMapper (); dynamic dSource = source; // return dMapper.Map (dSource); } /// /// Convert Type of Object to Safe Type /// /// /// /// public static T ConvertTo (this object source) { // T result = default (T); // try { // T item = (T) Convert.ChangeType (source, typeof (T)); // result = item; } catch { } // return result; } /// /// Convert an Instance to another Instance /// using AutoMapper dynamic Convertion /// /// /// /// public static T MapConvert (this T source) where T : class { // if (source.IsNull ()) { return null; } // var dSource = (object) source.ToDynamicObject (); return dSource.FromDynamicObject (); } /// /// Convert Using Auto Mapper ... /// /// /// /// /// public static T MapConvert (this E source) where T : class where E : class { // if (source.IsNull ()) { return null; } // var dMapConfig = new MapperConfiguration (b => { b.CreateMap () .ReverseMap (); }); var dMapper = dMapConfig.CreateMapper (); // var dSource = (object) dMapper.Map (source); var result = dMapper.Map (dSource); // return result; } /// /// Convert Using Auto Mapper ... /// /// /// /// /// public static IEnumerable MapConvert (this IEnumerable source) { // if (source.IsNull ()) { return null; } // var dMapConfig = new MapperConfiguration (b => { b.CreateMap () .ReverseMap (); }); var dMapper = dMapConfig.CreateMapper (); // var dSource = (object) dMapper.Map (source); var result = dMapper.Map> (dSource); // return result; } /// /// Convert Using Auto Mapper ... /// /// /// /// /// public static ICollection MapConvert (this ICollection source) { // if (source.IsNull ()) { return null; } // var dMapConfig = new MapperConfiguration (b => { b.CreateMap () .ReverseMap (); }); var dMapper = dMapConfig.CreateMapper (); // var dSource = (object) dMapper.Map (source); var result = dMapper.Map> (dSource); // return result; } /// /// Convert Using Auto Mapper ... /// /// /// /// /// public static IList MapConvert (this IList source) { // if (source.IsNull ()) { return null; } // var dMapConfig = new MapperConfiguration (b => { b.CreateMap () .ReverseMap (); }); var dMapper = dMapConfig.CreateMapper (); // var dSource = (object) dMapper.Map (source); var result = dMapper.Map> (dSource); // return result; } /// /// Convert Using Auto Mapper ... /// /// /// /// /// /// public static IDictionary MapConvert (this IDictionary source) { // if (source.IsNull ()) { return null; } // var dMapConfig = new MapperConfiguration (b => { b.CreateMap () .ReverseMap (); }); var dMapper = dMapConfig.CreateMapper (); // var dSource = (object) dMapper.Map (source); var result = dMapper.Map> (dSource); // return result; } /// /// Convert a Type to Static Type /// /// /// /// public static T ToStatic (this object source) { // var entity = Activator.CreateInstance (); // var properties = source as IDictionary; // if (properties == null) { return entity; } // foreach (var entry in properties) { // var propertyInfo = entity.GetType ().GetProperty (entry.Key); if (propertyInfo != null) { propertyInfo.SetValue (entity, entry.Value, null); } } // return entity; } /// /// Convert From Json String ... /// /// /// /// public static T FromJSON (this string value) { return JsonConvert.DeserializeObject (value); } /// /// Convert From Json String ... /// /// /// /// public static object FromJSON ( this string value, Type type ) { return JsonConvert .DeserializeObject (value, type); } /// /// Search a Json String for Specific Node ... /// /// /// /// public static List FindTokens (this JToken containerToken, string name) { List matches = new List (); FindTokens (containerToken, name, matches); return matches; } /// /// Convert to MD5 Bytes ... /// /// /// public static byte[] ToMd5Bytes (this string source) { return new MD5CryptoServiceProvider ().ComputeHash (Encoding.UTF8.GetBytes (source)); } /// /// Convert to MD5 String ... /// /// /// public static string ToMd5String (this string source) { // // string representation (similar to UNIX format) return BitConverter.ToString (source.ToMd5Bytes ()) // without dashes .Replace ("-", string.Empty) // make lowercase .ToLower (); } /// /// Check a String is MD5 String or not ... /// /// /// public static bool IsMD5String (this string source) { // if (String.IsNullOrEmpty (source)) { return false; } // return Regex.IsMatch (source, "^[0-9a-fA-F]{32}$", RegexOptions.Compiled); } /// /// Convert an string to Byte array Representation ... /// /// /// public static byte[] ToBytes (this string source) { return Encoding.UTF8.GetBytes (source); } /// /// Check object is Null ... /// /// /// public static bool IsNull (this object source) { return source == null; } /// /// Check collection Has Childs ... /// /// /// /// public static bool HasChild (this IList source) { return !source.IsNull () && source.Count () > 0; } /// /// Check collection Has Childs ... /// /// /// /// public static bool HasChild (this ICollection source) { return !source.IsNull () && source.Count () > 0; } /// /// Check collection Has Childs ... /// /// /// /// public static bool HasChild (this IEnumerable source) { return !source.IsNull () && source.Count () > 0; } /// /// Update a Collection item ... /// /// /// /// /// /// public static IList Update ( this IList source, T sourceItem, T updateWith ) { // var result = new List (); // // Validate Args ... if (!source.HasChild () || updateWith.IsNull () || sourceItem.IsNull () ) { return result; } // // Extract Item from source ... result = source .Except (new List () { sourceItem }) .ToList (); result.Add (updateWith); // return source; } /// /// Update a Collection item ... /// /// /// /// /// /// public static ICollection Update ( this ICollection source, T sourceItem, T updateWith ) { // var result = new List (); // // Validate Args ... if (!source.HasChild () || updateWith.IsNull () || sourceItem.IsNull () ) { return result; } // // Extract Item from source ... result = source .Except (new List () { sourceItem }) .ToList (); result.Add (updateWith); // return source; } /// /// Update a Collection item ... /// /// /// /// /// /// public static IEnumerable Update ( this IEnumerable source, T sourceItem, T updateWith ) { // var result = new List (); // // Validate Args ... if (!source.HasChild () || updateWith.IsNull () || sourceItem.IsNull () ) { return result; } // // Extract Item from source ... result = source .Except (new List () { sourceItem }) .ToList (); result.Add (updateWith); // return source; } /// /// Select and Retrieve Nth Childs of given List ... /// /// /// /// /// /// public static IEnumerable GetNthItems (this IList source, int n, bool throwException = false) { // var result = new List (); if (n < 1 || n > source.Count || source.IsNull () || !source.HasChild ()) { if (throwException) { throw XException.InvalidArgs.ToException (); } else { return result; } } // var index = 0; foreach (var item in source) { // result.Add (item); index++; // if (index >= n) { break; } } // return result; } /// /// Select and Retrieve Nth Childs of given List ... /// /// /// /// /// /// public static IEnumerable GetNthItems (this ICollection source, int n, bool throwException = false) { return source.ToList ().GetNthItems ( n: n, throwException: throwException ); } /// /// Select and Retrieve Nth Childs of given List ... /// /// /// /// /// /// public static IEnumerable GetNthItems (this IEnumerable source, int n, bool throwException = false) { return source.ToList ().GetNthItems ( n: n, throwException: throwException ); } /// /// Check an string is Null or Empty ... /// /// /// public static bool IsNullOrEmpty (this string sourse) { return string.IsNullOrEmpty (sourse); } /// /// Get string Value Attribute of an Enum ... /// /// /// public static string GetStringValue (this Enum source) { var type = source.GetType (); var fieldInfo = type.GetField (source.ToString ()); var attributes = fieldInfo.GetCustomAttributes (typeof (StringValueAttribute), false) as StringValueAttribute[]; return attributes != null && attributes.Length > 0 ? attributes[0].StringValue : null; } /// /// Extracts digit's of an string ... /// /// /// public static string GetDigits (this string source) { try { // Regex regexObj = new Regex (@"[^\d]"); return regexObj.Replace (source, ""); } catch { return null; } } /// /// Check an string is contains only digits ... /// /// /// public static bool IsDigits (this string source) { return (source.GetDigits () != null && source.GetDigits ().ToString () == source); } /// /// Convert to normal string, Trim and ToLower ... /// /// /// public static string ToNormalString (this string source) { // if (source.IsNullOrEmpty ()) { return string.Empty; } // return source.Trim ().ToLowerInvariant (); } /// /// Capitalize an string ... /// /// /// public static string Capitalize (this string source) { // if (source.IsNullOrEmpty ()) { return string.Empty; } // var result = ""; if (source.Length > 1) { // var firstCharr = source.Substring (0, 1); var otherParts = source.Substring (1, source.Length - 1); // result = firstCharr.ToUpperInvariant () + otherParts; } else { result = source.ToUpperInvariant (); } // return result; } /// /// Check an string is a Valid Representation of PhoneNumber ... /// /// /// public static bool IsValidMobileNumber (this string source) { // // Validating Mobile Numbers ... var phoneNumberUtil = PhoneNumbers.PhoneNumberUtil.GetInstance (); try { // var mPhoneNumber = phoneNumberUtil.Parse (source, null); if (phoneNumberUtil.IsValidNumber (mPhoneNumber)) { // return true; } // return false; } catch { // return false; } } /// /// Check an string is Valid Representation of Email Address ... /// /// /// public static bool IsValidEmail (this string source) { try { var addr = new System.Net.Mail.MailAddress (source); return addr.Address == source; } catch { return false; } } /// /// Check an string is Valid Representation of URL Address ... /// /// /// public static bool IsValidUrl (this string url) { return Uri.IsWellFormedUriString (url, UriKind.RelativeOrAbsolute); } /// /// check a URL has / at the end, if not add one ... /// /// /// public static string NormalizeUrl (this string url) { return url.EndsWith ("/") ? url : url + "/"; } /// /// Check an string is GUID or not ... /// /// /// public static bool IsGuid (this string source) { // // Validate Args ... if (source.IsNullOrEmpty ()) { return false; } // Guid guid; var result = Guid.TryParse (source, out guid); // return result; } /// /// Check Specific Guid string is Default Guid or not ... /// /// /// public static bool IsDefaultGuid (this string guid) { // if (!guid.IsGuid ()) { return false; } // var empty = Guid.Empty.ToString (); return guid == empty; } /// /// Check Specific Guid is Default Guid or not ... /// /// /// public static bool IsDefaultGuid (this Guid guid) { // var empty = Guid.Empty; return guid == empty; } /// /// Parse an String to related Enumerable Items ... /// /// /// /// /// public static IEnumerable ParseListString ( this string source, char? separator = null ) { // if (!separator.HasValue) { separator = CommonConstants.DEFAULT_LIST_SEPERATOR; } // var list = source.Split (separator.Value); var result = new Collection (); // foreach (var s in list) { // try { // T item = (T) Convert.ChangeType (s, typeof (T)); // result.Add (item); } catch { } } // return result; } /// /// Convert a List to List String ... /// /// /// /// /// public static string ToListString ( this IEnumerable source, char? separator = null ) { // if (!separator.HasValue) { separator = CommonConstants.DEFAULT_LIST_SEPERATOR; } // if (!source.HasChild ()) { return string.Empty; } // string result = String.Join ( separator .ToString (), source ); // return result; } /// /// get default value of a Type /// /// /// /// public static T Default (this T source) where T : class { return default (T); } /// /// Check if an object is Null or Default Value /// /// /// /// public static bool IsNullOrDefault (this T source) where T : class { return Equals (source, default (T)); } /// /// convert a timestamp to ISO String representation ... /// /// /// public static string ISODateString (this long timestamp) { // var time = timestamp.FromTimestamp (); var result = time.ToString ("o"); // return result; } /// /// convert timestamp to DateTime ... /// /// /// public static DateTime FromTimestamp (this long timestamp) { // var result = DateTimeOffset.FromUnixTimeMilliseconds (timestamp); return result.DateTime; } /// /// Check a Date Time is Expired or not /// /// /// public static bool IsExPired (this DateTime source) { // if (source == null) { return true; } // var currentDate = DateTime.UtcNow; var isExpired = currentDate >= source; // return isExpired; } /// /// Determines a File Type is Image Kind or not /// /// /// public static bool IsImageKind (this XFileType source) { // var imageKind = new Collection () { XFileType.Image, XFileType.CoverImage, XFileType.ProfileImasge }; // return imageKind.Contains (source); } /// /// Encode String as Url /// /// /// public static string ToUrlEncoded (this string source) { return HttpUtility.UrlEncode (source); } /// /// Decode Url String /// /// /// public static string ToUrlDecoded (this string source) { return HttpUtility.UrlDecode (source); } /// /// Convert an Object to string for use in HttpParams /// /// /// /// public static string ToHttpParamString (this object value, CultureInfo cultureInfo) { // if (value is Enum) { // string name = Enum.GetName (value.GetType (), value); if (name != null) { // var field = IntrospectionExtensions .GetTypeInfo (value.GetType ()) .GetDeclaredField (name); // if (field != null) { // var attribute = CustomAttributeExtensions .GetCustomAttribute (field, typeof (EnumMemberAttribute)) as EnumMemberAttribute; // if (attribute != null) { return attribute.Value != null ? attribute.Value : name; } } } } else if (value is bool) { return System.Convert.ToString (value, cultureInfo).ToLowerInvariant (); } else if (value is byte[]) { return System.Convert.ToBase64String ((byte[]) value); } else if (value != null && value.GetType ().IsArray) { // var array = Enumerable.OfType ((Array) value); return string.Join (",", Enumerable .Select ( array, o => o.ToHttpParamString (cultureInfo))); } // return System.Convert.ToString (value, cultureInfo); } /// /// ReShape an Object as HttpParam String /// /// /// public static string AsHttpParamString (this object value) { return System.Uri .EscapeDataString (value .ToHttpParamString (CultureInfo.InvariantCulture)); } /// /// Calculating Date Difference Provider String /// and Generate Date based on UTC Time in Milliseconds like unix Date ... /// /// /// public static long GenerateDateTimeOffset (this string offsetProvider) { // if (offsetProvider.IsNullOrEmpty ()) { return 0; } // var mExpireValue = 0; var mExpireValueStr = offsetProvider.GetDigits (); var mExpireUnit = offsetProvider.Replace (mExpireValueStr, ""); if (mExpireValueStr.IsNullOrEmpty () || mExpireUnit.IsNullOrEmpty ()) { return 0; } // var isParsed = int.TryParse (mExpireValueStr, out mExpireValue); if (!isParsed) { return 0; } // DateTime? date = null; switch (mExpireUnit) { case "d": date = DateTime.UtcNow.AddDays (mExpireValue); break; case "h": date = DateTime.UtcNow.AddHours (mExpireValue); break; case "m": date = DateTime.UtcNow.AddMinutes (mExpireValue); break; case "s": date = DateTime.UtcNow.AddSeconds (mExpireValue); break; case "ms": default: date = DateTime.UtcNow.AddMilliseconds (mExpireValue); break; } // var result = !date.HasValue ? 0 : new DateTimeOffset (date.Value) .ToUnixTimeMilliseconds (); // return result; } // #region Int Id Extensions ... public static bool IsValidIntId (this int source) { return source > 0; } public static void ValidateIntId (this int source) { // if (!source.IsValidIntId ()) { XException.InvalidArgs.Throw (); } } #endregion // #region StringExtensions for Identity Server ... public static string EnsureTrailingSlash (this string input) { if (!input.EndsWith ("/")) { return input + "/"; } return input; } public static bool IsMissing (this string value) { return string.IsNullOrWhiteSpace (value); } public static bool IsPresent (this string value) { return !string.IsNullOrWhiteSpace (value); } public static string Sha256 (this string input) { if (input.IsMissing ()) return string.Empty; using (var sha = SHA256.Create ()) { var bytes = Encoding.UTF8.GetBytes (input); var hash = sha.ComputeHash (bytes); return Convert.ToBase64String (hash); } } #endregion // #region Private ... private static void FindTokens (JToken containerToken, string name, List matches) { if (containerToken.Type == JTokenType.Object) { foreach (JProperty child in containerToken.Children ()) { if (child.Name == name) { matches.Add (child.Value); } FindTokens (child.Value, name, matches); } } else if (containerToken.Type == JTokenType.Array) { foreach (JToken child in containerToken.Children ()) { FindTokens (child, name, matches); } } } #endregion } }