using FastMember; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Knoks.Core { public static class Extensions { public static string ToJson(this T obj, Formatting formatting = Formatting.None) { return obj == null ? null : JsonConvert.SerializeObject(obj, formatting); } public static T JsonTo(this string json) { return json == null ? default(T) : JsonConvert.DeserializeObject(json); } private static ConcurrentDictionary> distProperties = new ConcurrentDictionary>(); private static ConcurrentDictionary> srcProperties = new ConcurrentDictionary>(); public static T CopyMembersTo(this object obj, T destinationObject) where T : class { var srcObj = obj; var dstObj = destinationObject; var srcType = srcObj.GetType(); var dstType = dstObj.GetType(); var srcAccessor = TypeAccessor.Create(srcType); var dstAccessor = TypeAccessor.Create(dstType); var srcMembers = srcProperties.GetOrAdd(srcType, (type) => srcAccessor.GetMembers().ToDictionary(k => k.Name)); foreach (var dstMember in distProperties.GetOrAdd(dstType, (type) => type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.CanWrite))) { if (srcMembers.TryGetValue(dstMember.Name, out Member srcMember)) { if (!dstMember.PropertyType.IsAssignableFrom(srcMember.Type)) continue; dstAccessor[dstObj, dstMember.Name] = srcAccessor[srcObj, srcMember.Name]; } } return dstObj; } public static T CopyMembersTo(this object obj) where T : class, new() { return obj.CopyMembersTo(new T()); } } }