private static IEnumerable <PropertyInfo> GetBaseProperties(Type type) { var currentLevelProperties = ValigatorModelBaseHelpers .GetProperties(type, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(p => !IsExplicitInterfaceImplementation(p)) .ToArray(); foreach (var currentProperty in currentLevelProperties) { if (type.IsValigatorModelBase()) { yield return(currentProperty); } else { var method = currentProperty.GetGetMethod(true) ?? currentProperty.GetSetMethod(true); var baseType = method?.GetBaseDefinition().DeclaringType; if (baseType != typeof(TModel)) { yield return(ValigatorModelBaseHelpers.GetProperty(baseType, currentProperty.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)); } else { yield return(currentProperty); } } } }
private static Dictionary <string, ValigatorJsonPropertyHandler <TObject> > CreatePropertyHandlers() { var result = new Dictionary <string, ValigatorJsonPropertyHandler <TObject> >(); foreach (var property in ValigatorModelBaseHelpers.GetProperties(typeof(TObject), BindingFlags.Public | BindingFlags.Instance)) { result.Add(property.Name, ValigatorJsonPropertyHandler <TObject> .Create(property)); } return(result); }
private static Func <TModel, PropertyDescriptor[]> CreatePropertyDescriptorsFunction() { var modelExpression = Expression.Parameter(typeof(TModel), "model"); var propertyDescriptors = ValigatorModelBaseHelpers .GetProperties(typeof(TModel)) .Where(property => property.PropertyType.IsConstructedGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Data <>)) .Select(property => CreatePropertyDescriptor(modelExpression, property)); var arrayInitializer = Expression.NewArrayInit(typeof(PropertyDescriptor), propertyDescriptors); return(Expression.Lambda <Func <TModel, PropertyDescriptor[]> >(arrayInitializer, modelExpression).Compile()); }