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);
        }
示例#2
0
        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);
        }