private static void FeedProperty(object model, PropertyInfo prop, int depth) { // Récupération du type de la proriété (soit son type direct, soit son type défini dans la propriété "Type" de l'annotation PropertyJsonApi Type typeprop = AttributeHandling.GetTypeProperty(prop); // Si on est autorisé en écriture (si ce n'est pas une readonly) if (prop.CanWrite) { // La liste ayant un traitement spécifique, on va vérifier qu'il s'agit d'une liste et récupérer immédiatement son type Type listType = null; if (prop.PropertyType.GetGenericArguments().Length > 0) { listType = prop.PropertyType.GetGenericArguments()[0]; } //Cas de la génération d'une propriété simple // /!\ les listes sont des types systèmes. Ainsi les List<Interface> auraient pue passerer dans ce test if (Utils.IsTypeSystem(typeprop) && (listType == null || !listType.IsInterface)) { prop.SetValue(model, Feed(typeprop, depth + 1)); } // Si on traite une interface, une classe ou un liste d'interface, alors on passera par la génération de modèle else if (typeprop.IsInterface || typeprop.IsClass || (listType != null && listType.IsInterface)) { FeedPropertyObject(model, prop, depth); } } }
private static bool IsSameType(PropertyInfo prop, Type outputType) { Type inType = prop.PropertyType; Type typeprop = AttributeHandling.GetTypeProperty(prop); if (prop.PropertyType.GetGenericArguments().Length > 0) { inType = prop.PropertyType.GetGenericArguments()[0]; typeprop = AttributeHandling.GetTypeProperty(prop).GetGenericArguments()[0]; } return((inType == outputType) || (typeprop == outputType)); }
private static void FeedPropertyObject(object modelToBind, PropertyInfo relationship, int depth) { // Récupération du type de la propriété Type typeRelationship = AttributeHandling.GetTypeProperty(relationship); // Génération d'une instance de ce type object tempObj = Activator.CreateInstance(typeRelationship); // Génération d'une liste de modèle if (Utils.IsEnum(tempObj)) { //--------Cas particulier------// //Type spécifié Type sendedType = typeRelationship.GetGenericArguments()[0]; //Type attendu Type waitingType = relationship.PropertyType.GetGenericArguments()[0]; //Instanciation particulière lorsque le type attendu dans le BO est une List<Interface> if (waitingType.GetTypeInfo().IsInterface) { tempObj = Activator.CreateInstance(typeof(List <>).MakeGenericType(waitingType)); } //---------------------------// BindList(sendedType, tempObj, depth); } // Génération d'un modèle simple else { BindModel(typeRelationship, tempObj, depth); } try { relationship.SetValue(modelToBind, tempObj); } catch (Exception) { //On ne bloque pas } }