public MetadataPropertyType ToProperty(PropertyInfo pi, object instance = null) { var property = new MetadataPropertyType { Name = pi.Name, Attributes = ToAttributes(pi.GetCustomAttributes(false)), Type = pi.PropertyType.GetMetadataPropertyType(), IsValueType = pi.PropertyType.IsValueType() ? true : (bool?)null, IsSystemType = pi.PropertyType.IsSystemType() ? true : (bool?)null, IsEnum = pi.PropertyType.IsEnum() ? true : (bool?)null, TypeNamespace = pi.PropertyType.Namespace, DataMember = ToDataMember(pi.GetDataMember()), GenericArgs = pi.PropertyType.IsGenericType() ? pi.PropertyType.GetGenericArguments().Select(x => x.ExpandTypeName()).ToArray() : null, Description = pi.GetDescription(), }; var apiMember = pi.FirstAttribute<ApiMemberAttribute>(); if (apiMember != null) { if (apiMember.IsRequired) property.IsRequired = true; property.ParamType = apiMember.ParameterType; property.DisplayType = apiMember.DataType; } var apiAllowableValues = pi.FirstAttribute<ApiAllowableValuesAttribute>(); if (apiAllowableValues != null) { property.AllowableValues = apiAllowableValues.Values; property.AllowableMin = apiAllowableValues.Min; property.AllowableMax = apiAllowableValues.Max; } if (instance != null) { var value = pi.GetValue(instance, null); if (value != null && !value.Equals(pi.PropertyType.GetDefaultValue())) { if (pi.PropertyType.IsEnum()) { property.Value = "{0}.{1}".Fmt(pi.PropertyType.Name, value); } else if (pi.PropertyType == typeof(Type)) { var type = (Type)value; property.Value = $"typeof({type.FullName})"; } else { var strValue = value as string; property.Value = strValue ?? value.ToJson(); } } if (pi.GetSetMethod() == null) //ReadOnly is bool? to minimize serialization property.ReadOnly = true; } return property; }
public string GetDescription(PropertyInfo propertyInfo) { return propertyInfo.GetDescription(); }