public OptionMetadata[] Build(Type optionsType) { var metadata = optionsType ?.GetProperties() .Select(property => new { Property = property, OptionAttribute = property.GetCustomAttribute <OptionAttribute>() }) .Where(aggregate => aggregate.OptionAttribute != null) .Select(aggregate => new { Property = aggregate.Property, OptionAttribute = aggregate.OptionAttribute, PossibleValues = _valueMetadataBuilder.Build(aggregate.Property) }) .Select(aggregate => { if (aggregate.PossibleValues == null) { return(new OptionMetadata( aggregate.OptionAttribute.Name, aggregate.OptionAttribute.Description, aggregate.Property)); } else { return(new OptionEnumMetadata( aggregate.OptionAttribute.Name, aggregate.OptionAttribute.Description, aggregate.Property, aggregate.PossibleValues)); } }) .ToArray() ?? Array.Empty <OptionMetadata>(); return(metadata); }
public ArgumentMetadata[] Build(Type argumentsType) { var metadata = argumentsType ?.GetProperties() .Select(property => new { Property = property, ArgumentAttribute = property.GetCustomAttribute <ArgumentAttribute>() }) .Where(aggregate => aggregate.ArgumentAttribute != null) .Select(aggregate => new { Property = aggregate.Property, ArgumentAttribute = aggregate.ArgumentAttribute, PossibleValues = _valueMetadataBuilder.Build(aggregate.Property) }) .Select(aggregate => { if (aggregate.PossibleValues == null) { return(new ArgumentMetadata( aggregate.Property.Name, aggregate.ArgumentAttribute.Description, aggregate.Property.PropertyType.IsArray)); } else { return(new ArgumentEnumMetadata( aggregate.Property.Name, aggregate.ArgumentAttribute.Description, aggregate.Property.PropertyType.IsArray, aggregate.PossibleValues)); } }) .ToArray() ?? Array.Empty <ArgumentMetadata>(); return(metadata); }