private static IEnumerable <Field> RenderFields(HttpContext httpContext, object feature, MethodInfo method, ParameterInfo parameter) { var type = parameter.ParameterType; if (IsSimpleValue(type)) { var field = new Field(); field.Name = GetName(parameter); field.Title = field.Name.ChangeCase(TextCase.ProperCase); field.DataType = KnownFieldDataTypes.GetDataTypeName(type); field.Type = KnownFieldTypes.GetTypeName(field.DataType); yield return(field); } else { var prefix = GetName(parameter); var category = prefix.ChangeCase(TextCase.ProperCase); var properties = type.GetProperties(); foreach (var property in properties) { var suffix = GetName(property); var field = new Field(); field.Category = category; field.Name = $"{prefix}.{suffix}"; field.Title = suffix.ChangeCase(TextCase.ProperCase); field.DataType = KnownFieldDataTypes.GetDataTypeName(property.PropertyType); field.Type = KnownFieldTypes.GetTypeName(field.DataType); var widget = type.GetCustomAttributes(true).OfType <WidgetAttribute>().FirstOrDefault(); if (widget != null) { field.CopyFrom(widget); field.Properties = new FieldProperties(); field.Properties.CopyFrom(widget); // TODO: Implementar HAS OPTIONS de alguma forma // //// Verificando se o widget da suporte à interface IHasOptions<TOption> //var options = field.Get<Option[]>("Options"); //if (options != null) //{ // var values = field.Get<object[]>("Value"); // if (values == null) // { // var value = field.Get("Value"); // values = value.AsSingle().NonNull().ToArray(); // } // var fieldValues = new FieldValueCollection(); // foreach (var option in options) // { // var fieldValue = new FieldValue(); // fieldValue.CopyFrom(options); // fieldValue.Selected = values.Contains(option.Value); // } // field.Value = fieldValues; //} } yield return(field); } } }
public static string MakeFieldType(Type type) { return(KnownFieldDataTypes.GetDataTypeName(type) ?? KnownFieldDataTypes.Text); }