protected void AssignCrossViewWrappersToVm() { // Reference for ViewModel saved for optimization // (otherwise it will be searched somwhere in service's dictionary). var vm = ViewModel; if (vm == null) { throw new CrossViewInjectorException(string.Format(NullExceptionMessage, nameof(ViewModel))); } if (ViewModelContainer == null) { throw new CrossViewInjectorException(string.Format(NullExceptionMessage, nameof(ViewModelContainer))); } var viewControllerProperties = FindCrossViewAttributedValues(ViewModelContainer?.GetType()); var viewModelProperties = FindCrossViewAttributedValues(ViewModel?.GetType()); foreach (var controllerProp in viewControllerProperties.Where(controllerProp => !viewModelProperties.ContainsKey(controllerProp.Key))) { ExceptionLogger.RaiseNonFatalException(new Exception( $"{controllerProp.Key} cross view property declared in [{ViewModelContainer.GetType().Name}] was not found in [{vm.GetType().Name}]")); } foreach (var vmProp in viewModelProperties.Where( vmProp => !viewControllerProperties.ContainsKey(vmProp.Key))) { ExceptionLogger.RaiseNonFatalException(new Exception( $"{vmProp.Key} cross view property declared in [{vm.GetType().Name}] was not found in [{ViewModelContainer.GetType().Name}]")); } foreach (var item in viewModelProperties) { if (!viewControllerProperties.TryGetValue(item.Key, out var propertyWithValueToSet)) { continue; } if (item.Value.CanWrite) { try { if (propertyWithValueToSet.CanRead) { item.Value.SetValue(ViewModel, GetWrapperForView(propertyWithValueToSet?.GetValue(ViewModelContainer))); } else { ExceptionLogger.RaiseNonFatalException( new CrossViewInjectorException(GetterIsForbidden)); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } } else { ExceptionLogger.RaiseNonFatalException( new CrossViewInjectorException(SetterIsForbidden)); } } }