/// <summary> /// Use for a client validation. Server contract is determined automatically by MapFromContractAttribute /// </summary> public static bool CheckClientMatchesServer <TClientData>(out FieldMismatch[] fieldMismatches) { var mapFromContractAttribute = ReflectionProvider.FindMapFromContractAttribute(typeof(TClientData)); if (mapFromContractAttribute == null) { var message = $"Type {typeof(TClientData)} should have {nameof(MapFromContractAttribute)} attribute"; throw new InvalidOperationException(message); } var serverType = mapFromContractAttribute.DataContractType; fieldMismatches = ResponseSpecificationMatcher.FindClientFieldMismatches(typeof(TClientData), serverType); return(fieldMismatches.Length == 0); }
private static TreeNode TraverseWithoutCaching(Type type, Stack <Type> traverseStack) { if (IsSimpleType(type)) { return(TreeNode.Empty); } if (ReflectionProvider.TryGetDictionaryValueType(type, out var valueType)) { return(TreeNode.Dictionary(TraverseWithCaching(valueType, traverseStack))); } if (ReflectionProvider.TryGetEnumerableElementType(type, out var elementType)) { return(TreeNode.Collection(TraverseWithCaching(elementType, traverseStack))); } var properties = ReflectionProvider.GetProperties(type) .Select(p => new ObjectProperty(p, TraverseWithCaching(p.PropertyType, traverseStack))) .ToArray(); return(TreeNode.Object(properties)); }
public ObjectProperty(PropertyInfo property, TreeNode tree) { ResponseName = ReflectionProvider.GetPropertyResponseName(property); Tree = tree; propertyGetter = DelegateGenerator.GeneratePropertyGetter(property); }