internal static TypeErrorsBuilder CheckRequiresReferenceHandling( this TypeErrorsBuilder typeErrors, Type type, MemberSettings settings, Func<Type, bool> requiresReferenceHandling) { if (settings.ReferenceHandling == ReferenceHandling.Throw) { if (typeof(IEnumerable).IsAssignableFrom(type)) { if (type.Implements(typeof(IDictionary<,>))) { var arguments = type.GetGenericArguments(); if (arguments.Length != 2 || requiresReferenceHandling(arguments[0]) || requiresReferenceHandling(arguments[1])) { typeErrors = typeErrors.CreateIfNull(type) .Add(RequiresReferenceHandling.Enumerable); } } else if (requiresReferenceHandling(type.GetItemType())) { typeErrors = typeErrors.CreateIfNull(type) .Add(RequiresReferenceHandling.Enumerable); } } else if (type.IsKeyValuePair()) { var arguments = type.GetGenericArguments(); if (requiresReferenceHandling(arguments[0]) || requiresReferenceHandling(arguments[1])) { typeErrors = typeErrors.CreateIfNull(type) .Add(RequiresReferenceHandling.ComplexType); } } else if (requiresReferenceHandling(type)) { typeErrors = typeErrors.CreateIfNull(type) .Add(RequiresReferenceHandling.ComplexType); } } return typeErrors; }
internal static TypeErrorsBuilder CheckIndexers(this TypeErrorsBuilder typeErrors, Type type, MemberSettings settings) { var propertiesSettings = settings as PropertiesSettings; var propertyInfos = type.GetProperties(settings.BindingFlags); foreach (var propertyInfo in propertyInfos) { if (propertyInfo.GetIndexParameters().Length == 0) { continue; } if (propertiesSettings?.IsIgnoringProperty(propertyInfo) == true) { continue; } if (settings.IsIgnoringDeclaringType(propertyInfo.DeclaringType)) { continue; } typeErrors = typeErrors.CreateIfNull(type) .Add(UnsupportedIndexer.GetOrCreate(propertyInfo)); } return typeErrors; }
internal static TypeErrorsBuilder CheckNotifies(this TypeErrorsBuilder typeErrors, Type type, MemberSettings settings) { if (settings.IsImmutable(type)) { return typeErrors; } if (type.IsValueType) { if (typeof(INotifyCollectionChanged).IsAssignableFrom(type) || typeof(INotifyPropertyChanged).IsAssignableFrom(type)) { return typeErrors.CreateIfNull(type) .Add(StructMustNotNotifyError.GetOrCreate(type)); } return typeErrors; } if (typeof(IEnumerable).IsAssignableFrom(type)) { if (!typeof(INotifyCollectionChanged).IsAssignableFrom(type)) { return typeErrors.CreateIfNull(type) .Add(CollectionMustNotifyError.GetOrCreate(type)); } } else if (!typeof(INotifyPropertyChanged).IsAssignableFrom(type)) { if (settings.IsIgnoringDeclaringType(type)) { return typeErrors; } return typeErrors.CreateIfNull(type) .Add(TypeMustNotifyError.GetOrCreate(type)); } return typeErrors; }