public static EntitySearchDisplayInfo ResourceModel(Related related, int index) { var indexName = GetName(related, index); var rm = GetResourceCollection(related); var info = new EntitySearchDisplayInfo { Title = new ResourceManager(rm.Titles).GetString(indexName), Column = rm.Columns == null ? null: new ResourceManager(rm.Columns).GetString(indexName), Description = new ResourceManager(rm.Descriptions).GetString(indexName), ShortName = new ResourceManager(rm.ShortNames).GetString(indexName), }; if (info.Title == null && info.Column == null && info.Description == null || info.ShortName == null) { return(null); } return(info); }
/// <summary> /// Busqueda en el diccionario /// </summary> /// <param name="property">Propiedades de las entidades</param> /// <param name="index">Index de las entidades</param> /// <returns></returns> public EntitySearchDisplayInfo GetInfoFromProperty(KindProperty property, int index) { var indexName = ResourcesHelper.GetName(property, index); var rm = ResourcesHelper.GetResourceCollection(property); var info = new EntitySearchDisplayInfo { Title = new ResourceManager(rm.Titles).GetString(indexName), Column = rm.Columns == null ? null : new ResourceManager(rm.Columns).GetString(indexName), Description = new ResourceManager(rm.Descriptions).GetString(indexName), ShortName = new ResourceManager(rm.ShortNames).GetString(indexName), }; if (info.Title == null && info.Column == null && info.Description == null || info.ShortName == null) { return(null); } return(info); }
public EntitySearchDisplayInfo GetInfoFromEntity(int index) { var indexName = ResourcesHelper.GetEntityName(index); var rm = ResourcesHelper.GetEntityResourceCollection(); var info = new EntitySearchDisplayInfo { Title = new ResourceManager(rm.Titles).GetString(indexName), Column = rm.Columns == null ? null : new ResourceManager(rm.Columns).GetString(indexName), Description = new ResourceManager(rm.Descriptions).GetString(indexName), ShortName = new ResourceManager(rm.ShortNames).GetString(indexName), PlaceHolder = new ResourceManager(rm.PlaceHolders)?.GetString(indexName) ?? "", }; if (info.Title == null && info.Column == null && info.Description == null || info.ShortName == null) { return(null); } return(info); }
/// <summary> /// obtiene la metadata de una propiedad desde una clase de entrada /// el objetivo es unir la propiedad de input a una en el modelo o viceversa /// De esta manera, más los atributos, podrá generar la metadata necesaria para operar con la propiedad. /// </summary> /// <param name="input">clase input</param> /// <param name="output">clase output</param> /// <param name="propertyInput">propiedad del input</param> /// <param name="info">documentacion de la propiedad</param> /// <returns>Metadata de una propiedad y el target encontrado (esto es util para RelatedProperty)</returns> public static (PropertyMetadata meta, BaseIndexAttribute target) GetPropMetadata(Type input, Type output, PropertyInfo propertyInput, EntitySearchDisplayInfo info) { // existe clase de entrada var existsClassInput = input != null; // exoste clase de salida var existsClassOutput = output != null; // la clase de entrada puede ser modelo o input // si la clase de entrada es nula lanzará excepción if (!existsClassInput) { throw new CustomException("la clase input no puede ser nula"); } // determina si la clase de entrada es input var isInput = input.IsSubclassOf(typeof(InputBase)); // no puede existir una clase input que no tenga una clase modelo. if (isInput && !existsClassOutput) { throw new CustomException("la clase output no puede ser nula, si la clase de entrada es tipo input"); } // si existsClassOutput es nulo, significa que la clase output es input // si cla clase output es nula, no es posible obtener la info de la propiedad de esa clase. // si ambos clases existen. // se buscará la unión por nombre o por atributos, de preferencia atributos var propOutput = existsClassOutput ? GetPropOutput(output, propertyInput) : null; // si es input, significa que después habrá una herencia y se le asignará el ClassNameInput var className = isInput ? output.Name : input.Name; // indice del input, por obligación ambos deben tener el atributo Entity var index = Reflection.Entities.GetIndex(input); // si es input, la propiedad puede tener el mismo nombre y/o igualarse por la unión por atributos // si es el mismo nombre, no tiene BaseIndexAttribute var inputPropAttr = Reflection.Attributes.GetAttribute <BaseIndexAttribute>(propertyInput); // el propOut puede ser nulo var outputPropAttr = propOutput != null?Reflection.Attributes.GetAttribute <BaseIndexAttribute>(propOutput) : null; // de preferencia toma el input, pero si este es nulo o no tiene atributo, toma el segundo. var entityPropAttr = inputPropAttr != null ? inputPropAttr : outputPropAttr; var isArray = Reflection.IsEnumerableProperty(propertyInput); // esto se da en el caso de que se tenga que ir a buscar el índice en la misma clase y no en la propiedad // debido a que no tiene el atributo en la propiedad del modelo. if (entityPropAttr == null && !isInput && !Reflection.IsPrimitive(propertyInput.PropertyType)) { var modelTypes = Common.GetTypeModel(output.Assembly); var localType = modelTypes.FirstOrDefault(s => isArray ? s.Equals(propertyInput.PropertyType.GenericTypeArguments.First()) : s.Equals(propertyInput.PropertyType)); // asigna el atributo de la clase a la que apunta la propiedad. entityPropAttr = Reflection.Attributes.GetAttributes <EntityIndexAttribute>(localType).First(); } if (entityPropAttr == null && isInput) { var modelTypes = Common.GetTypeInputModel(input.Assembly); var localType = modelTypes.FirstOrDefault(s => isArray ? s.Equals(propertyInput.PropertyType.GenericTypeArguments.First()) : s.Equals(propertyInput.PropertyType)); // asigna el atributo de la clase a la que apunta la propiedad. entityPropAttr = localType == null ? null : Reflection.Attributes.GetAttributes <EntityIndexAttribute>(localType).First(); } if (entityPropAttr == null && Reflection.IsPrimitive(propertyInput.PropertyType)) { // lanza excepción si una propiedad no tiene atributos. throw new CustomException($"la propiedad {propertyInput.Name} no tiene atributos"); } // los elementos de validación siempre estarán en la clase input. // obtiene los atributos requeridos var requiredAttr = propOutput != null? isInput?Reflection.Attributes.GetAttribute <RequiredAttribute>(propertyInput) : Reflection.Attributes.GetAttribute <RequiredAttribute>(propOutput) : null; // obtiene los atributos unicos var uniqueAttr = propOutput != null? isInput? Reflection.Attributes.GetAttribute <UniqueAttribute>(propertyInput) : Reflection.Attributes.GetAttribute <UniqueAttribute>(propOutput) : null; // obtiene los atributos de ocultar. var hideAttr = propOutput != null? isInput? Reflection.Attributes.GetAttribute <HideAttribute>(propertyInput) : Reflection.Attributes.GetAttribute <HideAttribute>(propOutput) : null; // el tipo de una propiedad que es de tipo colección, puede buscar el tipo en dos lugares, de acuerdo a si es un array o una colección. var tp = propertyInput.PropertyType.IsArray ? propertyInput.PropertyType.GetElementType() : propertyInput.PropertyType.GenericTypeArguments.FirstOrDefault(); return(new PropertyMetadata { AutoNumeric = IsAutoNumeric(input, propertyInput), ClassName = className, HasInput = isInput ? true : propOutput != null, Index = entityPropAttr?.Index ?? 0, KindProperty = entityPropAttr == null?KindProperty.STR:(KindProperty)entityPropAttr.KindIndex, Info = info, isArray = isArray, NameProp = propertyInput.Name, Required = requiredAttr != null, TypeString = isArray ? tp.Name : propertyInput.PropertyType.Name, Unique = uniqueAttr != null, Visible = hideAttr == null, IndexFather = index.Value }, entityPropAttr); }
/// <summary> /// Obtiene metadata de propiedad input de tipo enumeración. /// </summary> /// <param name="input">tipo input</param> /// <param name="model">tipo model</param> /// <param name="propertyInput">propiedad del input</param> /// <param name="info">documentación de la propiedad</param> /// <returns>metadata de una enumeración input</returns> public static InputPropEnumDetails GetPropInputEnumMetadata(Type input, Type model, PropertyInfo propertyInput, EntitySearchDisplayInfo info) { return(GetPropInputEnumMetadata(GetEnumPropMetadata(input, model, propertyInput, info), input, model, propertyInput)); }
/// <summary> /// Obtiene la metadata de una propiedad de entidad de input /// </summary> /// <param name="input">tipo input</param> /// <param name="model">tipo model</param> /// <param name="propertyInput">propiedad del input</param> /// <param name="info">documentación de la propiedad</param> /// <returns>Metadata de una propiedad input de tipo entidad</returns> public static InputPropRelatedDetails GetPropInputRelatedMetadata(Type input, Type model, PropertyInfo propertyInput, EntitySearchDisplayInfo info) { return(GetPropInputRelatedMetadata(GetRelatedMetadata(input, model, propertyInput, info), input, model, propertyInput)); }
/// <summary> /// Complementa una metadata con los datos de la propiedad entidad. /// </summary> /// <param name="input">clase de entrada, puede ser un input o un model</param> /// <param name="output">clase de salida, puede ser un input o un model</param> /// <param name="propertyInput">propiedad perteneciente a la clase input</param> /// <param name="info"></param> /// <returns>Metadata de una propiedad de entidad</returns> public static PropertyMetadadataEnum GetEnumPropMetadata(Type input, Type output, PropertyInfo propertyInput, EntitySearchDisplayInfo info) { return(GetEnumPropMetadata(GetPropMetadata(input, output, propertyInput, info).meta, input, output, propertyInput)); }
/// <summary> /// Obtiene la metadata de una propiedad tipo entidad /// </summary> /// <param name="input">clase de entrada, puede ser un input o un model</param> /// <param name="output">clase de salida, puede ser un input o un model</param> /// <param name="propertyInput">propiedad perteneciente a la clase input</param> /// <param name="info">documentación de la propiedad</param> /// <returns>Metadata de la propiedad</returns> public static RelatedPropertyMetadata GetRelatedMetadata(Type input, Type output, PropertyInfo propertyInput, EntitySearchDisplayInfo info) { return(GetRelatedMetadata(GetPropMetadata(input, output, propertyInput, info), input, output, propertyInput)); }