public static async Task FetchForeignKeysForViewModelAsync <T>(this GridViewModel <T> result, GenericForeignKeyRepository genericFKRepo) { var keys = typeof(T).GetProperties().Where(e => e.CustomAttributes.Any(y => y.AttributeType.FullName.Contains("RemoteForeignKeyAttribute"))); foreach (var key in keys) { string Repository, Endpoint, IDField, ValueField, Delimiter, Lookup = null; string StringLiteral = "true"; /* * Get Fields from VM required for FK data calls */ Repository = key.GetCustomAttributesData().First().NamedArguments.Where(asd => asd.MemberName == "Repository").Select(u => u.TypedValue.Value).FirstOrDefault() as string; Endpoint = key.GetCustomAttributesData().First().NamedArguments.Where(asd => asd.MemberName == "Endpoint").Select(u => u.TypedValue.Value).FirstOrDefault() as string; IDField = key.GetCustomAttributesData().First().NamedArguments.Where(asd => asd.MemberName == "IDField").Select(u => u.TypedValue.Value).FirstOrDefault() as string; ValueField = key.GetCustomAttributesData().First().NamedArguments.Where(asd => asd.MemberName == "ValueField").Select(u => u.TypedValue.Value).FirstOrDefault() as string; StringLiteral = key.GetCustomAttributesData().First().NamedArguments.Where(asd => asd.MemberName == "StringLiteral").Select(u => u.TypedValue.Value).FirstOrDefault() as string; Delimiter = key.GetCustomAttributesData().First().NamedArguments.Where(asd => asd.MemberName == "Delimiter").Select(u => u.TypedValue.Value).FirstOrDefault() as string; Lookup = key.GetCustomAttributesData().First().NamedArguments.Where(asd => asd.MemberName == "Lookup").Select(u => u.TypedValue.Value).FirstOrDefault() as string; /* * Loop through the filtered dataset and go get the required * remote data using the configuration properties gathered * from above */ foreach (T item in result.Data) { var propertyInfo = item.GetType().GetProperty(key.Name); if (propertyInfo != null && propertyInfo.CanWrite) { var setter = propertyInfo.SetMethod; if (StringLiteral == "true" && IDField != null) { var id = Int32.Parse((item.GetType().GetProperty(IDField).GetValue(item).ToString())); var results = await genericFKRepo.GetGenericForeignKeyByIdAsync(id, Repository, Endpoint); setter.Invoke(item, new object[] { ValueField.ConcatValues(results, Delimiter) }); } if (Lookup == "true" && StringLiteral == "false") { /* * Loop through the filtered dataset and go get the required * remote data using the configuration properties gathered * from above */ var results = await genericFKRepo.GetGenericRemoteLookupsAsync(Repository, Endpoint); setter.Invoke(item, new object[] { ValueField.ConcatValuesForLookup(results, Delimiter, IDField) }); // var a = await genericFKRepo.GetSectionPOCCostCodeByIdObjAsync(id); // setter.Invoke(item, new object[] { a.Value }); } } } } }