/// <summary>
        /// Создаёт новый контекст описания свойств модели.
        /// </summary>
        public DescriptionContext(IApplicationDataProvider infoProvider, Type modelType, TextWriter writer)
        {
            ApplicationInfo = infoProvider;
            Writer          = writer;
            var properties = MetadataProvider.ReadMetadata(modelType);

            HasNoArguments = properties.Count == 0;
            var data = properties.OfType <PropertyMetadata>().GroupBy(metadata => metadata.PropertyKind).ToDictionary(g => g.Key, g => g.ToList());
            List <PropertyMetadata> temp;

            if (data.TryGetValue(Kind.Named, out temp))
            {
                NamedProperties = temp;
            }
            if (data.TryGetValue(Kind.Positional, out temp))
            {
                PositionalOrderedProperties = temp.OrderBy(m => m.Specification.Position).ToList();
            }
            if (data.TryGetValue(Kind.Unbound, out temp))
            {
                if (temp.Count > 1)
                {
                    throw new InvalidOperationException("Only one property could be marked by " + typeof(UnboundAttribute).Name);
                }
                if (temp.Count == 1)
                {
                    UnboundProperty = temp[0];
                }
            }
            NamedArgsInfo = MetadataProvider.GetNamedArgumentsPolicy(modelType);
        }
Esempio n. 2
0
 /// <summary>
 /// Создаёт новый экземпляр класса.
 /// </summary>
 /// <param name="dataProvider">Поставщик основной информации о запускаемом приложении.</param>
 /// <param name="modelType">Тип модели.</param>
 /// <param name="showLogo">Флаг, определяющий необходимость отображения информации о приложении.</param>
 public UsagePrinter(Type modelType, IApplicationDataProvider dataProvider, bool showLogo = true)
 {
     this.showLogo  = showLogo;
     this.modelType = modelType;
     appInfo        = dataProvider;
 }