internal static TMapped To <TMapped>(this object from) where TMapped : new() { var mapped = new TMapped(); var map = from.GetType().GetProperties() .Join( typeof(TMapped).GetProperties(), pf => pf.Name, pt => pt.Name, (pf, pt) => new { From = pf, To = pt }); foreach (var p in map) { try { var fromType = Nullable.GetUnderlyingType(p.From.PropertyType) ?? p.From.PropertyType; var toType = Nullable.GetUnderlyingType(p.To.PropertyType) ?? p.To.PropertyType; if (toType.IsEnum) { var s = p.From.GetValue(from)?.ToString(); if (s != null) { var e = Enum.Parse(toType, s); p.To.SetValue(mapped, e); } } else if (fromType.IsEnum && toType.IsAssignableFrom(typeof(string))) { var s = p.From.GetValue(from)?.ToString(); p.To.SetValue(mapped, s); } else if (typeof(Hashtable).IsAssignableFrom(toType)) { var ht = p.From.GetValue(from).ToHashtable(); p.To.SetValue(mapped, ht); } else if (fromType.IsAssignableFrom(toType)) { var v = p.From.GetValue(from); p.To.SetValue(mapped, v); } } catch (Exception e) { UiPathCmdlet.DebugMessage($"{from?.GetType().Name}->{typeof(TMapped)}:{p.From.Name}: {e.GetType().Name}: {e.Message}"); } } return(mapped); }
private static object To(this object from, Type tMapped, Func <object> ctor) { if (from is Hashtable hashtable) { return(FromHashtable(hashtable, tMapped, ctor)); } if (typeof(Hashtable).IsAssignableFrom(tMapped)) { return(from.ToHashtable()); } var mapped = ctor(); var map = from.GetType().GetProperties() .Join( tMapped.GetProperties(), pf => pf.Name, pt => pt.Name, (pf, pt) => new { From = pf, To = pt }); foreach (var p in map) { try { var fromType = Nullable.GetUnderlyingType(p.From.PropertyType) ?? p.From.PropertyType; var toType = Nullable.GetUnderlyingType(p.To.PropertyType) ?? p.To.PropertyType; if (toType.IsArray) { var toElementType = EnumerableElementType(toType); var fromValue = p.From.GetValue(from); var toValue = ToEnumerable(fromValue, toElementType); p.To.SetValue(mapped, ToArray(toValue, toElementType)); } else if (toType.IsEnum) { var s = p.From.GetValue(from)?.ToString(); if (s != null) { var e = Enum.Parse(toType, s); p.To.SetValue(mapped, e); } } else if (fromType.IsEnum && toType.IsAssignableFrom(typeof(string))) { var s = p.From.GetValue(from)?.ToString(); p.To.SetValue(mapped, s); } else if (typeof(Hashtable).IsAssignableFrom(toType)) { var ht = p.From.GetValue(from).ToHashtable(); p.To.SetValue(mapped, ht); } else if (fromType.IsAssignableFrom(toType)) { var v = p.From.GetValue(from); p.To.SetValue(mapped, v); } } catch (Exception e) { UiPathCmdlet.DebugMessage($"{from?.GetType().Name}->{tMapped}:{p.From.Name}: {e.GetType().Name}: {e.Message}"); } } return(mapped); }