private ISchemaRequiredField GetCollectionField(PropertyInfo child, KeyValuePair <int, AgreementSchemaType> parent) { var collectionStrategy = new CollectionStrategy <ISchemaRequiredField>( dictionaryAction: collectionType => { var keyValueTypes = CollectionElementTypeProvider.Get(collectionType); var keyType = keyValueTypes[0]; var keySchema = dictionaryBase.Get(keyType); var valueType = keyValueTypes[1]; var valueSchema = dictionaryBase.Get(valueType); return(new DictionaryRequiredField(name: child.Name, level: parent.Key, type: string.Format(TypesNamesConsts.DictionaryOf, dictionaryRootNameBase.Get(keyType), dictionaryRootNameBase.Get(valueType)), keyFields: keySchema, valueFields: valueSchema)); }, simpleNonGenericAction: collectionType => { var elementType = CollectionElementTypeProvider.Get(collectionType)[0]; return(new ComplexCollectionRequiredField( name: child.Name, level: parent.Key, type: TypesNamesConsts.CollectionOf + elementType.Name, requiredFields: GetRequiredFields(elementType))); }, complexNonGenericAction: collectionType => { var elementType = CollectionElementTypeProvider.Get(collectionType)[0]; return(new SimpleCollectionRequiredField( name: child.Name, level: parent.Key, type: TypesNamesConsts.CollectionOf + elementType.FullName)); }); return(collectionStrategy.Get(child.PropertyType)); }
private ISchemaRequiredField GetField(PropertyInfo child, KeyValuePair <int, AgreementSchemaType> parent) { var fieldStrategy = new TypeStrategy <ISchemaRequiredField>( simpleTypeAction: type => new SimpleRequiredField(name: child.Name, level: parent.Key, type: child.PropertyType.ToString()), collectionTypeAction: type => GetCollectionField(child, parent), complexTypeAction: type => { var nextLevel = parent.Key + 1; complexTypeStack.Push(new KeyValuePair <int, AgreementSchemaType>(nextLevel, new AgreementSchemaType(child.PropertyType.Name, child.PropertyType))); return(new ClassRequiredField(name: child.Name, level: parent.Key, type: parent.Value.Name == TypesNamesConsts.InitialType ? child.PropertyType.Name : parent.Value.Name)); }); return(fieldStrategy.Get(child.PropertyType)); }