Example #1
0
        public static object ToDataShapeObject(this ClientDTO client, List <string> lstOfFields)
        {
            List <string> lstOfFieldsToWorkWith = new List <string>(lstOfFields);

            if (!lstOfFieldsToWorkWith.Any())
            {
                return(client);
            }
            else
            {
                var lstOfAddressFields = lstOfFieldsToWorkWith.Where(f => f.Contains("addresses.")).ToList();

                bool returnPartialAddress = lstOfAddressFields.Any() && !lstOfAddressFields.Contains("addresses.");

                if (returnPartialAddress)
                {
                    lstOfFieldsToWorkWith.RemoveAll(f => f.Contains("addresses."));
                    lstOfAddressFields = lstOfAddressFields.Select(f => f.Substring(f.IndexOf(".") + 1)).ToList();
                }
                else
                {
                    //lstOfAddressFields.Remove("addresses");
                    lstOfFieldsToWorkWith.RemoveAll(f => f.Contains("addresses."));
                }

                ExpandoObject objectToReturn = new ExpandoObject();
                foreach (var field in lstOfFieldsToWorkWith)
                {
                    var fieldValue = client.GetType()
                                     .GetProperty(field, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance)
                                     .GetValue(client, null);

                    ((IDictionary <string, object>)objectToReturn).Add(field, fieldValue);
                }

                if (returnPartialAddress)
                {
                    List <object> addresses = new List <object>();
                    foreach (var address in client.Addresses)
                    {
                        addresses.Add(address.ToDataShapeObject(lstOfAddressFields));
                    }

                    ((IDictionary <string, object>)objectToReturn).Add("addresses", addresses);
                }
                return(objectToReturn);
            }
        }