/
yeremee
/
CmdLineParameters
Обзор
Документация
Войти
/
yeremee
/
CmdLineParameters
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
CmdlineParameters.cs
217 строк
11 KB
Yεrεmεe
Репозиторий создан
01 мар 2026, 21:41
01 мар 2026, 21:41
1ebfa68
Код
Авторство
О чём код?
using CmdLineParameters.Internals; using CmdLineParameters.Properties; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace CmdLineParameters; /// <summary> /// Базовый класс, служащий для определения набора параметров командной строки. /// </summary> /// <remarks> /// Содержит конструктор, который используется в производном классе для создания экземпляра объявленного набора параметров. /// </remarks> public abstract class CmdlineParameters { /// <summary> /// Текстовое представление текущего набора параметров и его маски сочетаемости. /// </summary> /// <remarks> /// Полезно при анализе аргументов и выводе сводной информации, например, на консоль. /// </remarks> public string ОтладочнаяИнформация { get; private set; } ///// <summary> ///// Конкретизированная маска сочетаемости текущего набора параметров. ///// </summary> ///// <remarks> ///// Состоит из пар «название группы и её значение». ///// </remarks> //public Enum[] ГруппыСочетаемостиНабора { get; private set; } /// <summary> /// Создаёт экземпляр набора параметров командной строки на основе указанных аргументов. /// </summary> /// <remarks> /// Конструктор выполняет анализ и назначение переданных аргументов командной строки полям производного класса, /// объявляющим параметры. /// </remarks> /// <param name="args">аргументы командной строки</param> public CmdlineParameters(string[] args) { #region Проверка корректности типа набора параметров, групп сочетаемости, и самих параметров НаборПараметров наборПараметров = new(this.GetType()); if (наборПараметров.ЯвляетсяКорректным() is CmdlineParameterException ошибка1) throw ошибка1; if (наборПараметров.ГруппыСочетаемостиКорректны() is CmdlineParameterException ошибка2) throw ошибка2; if (наборПараметров.ПараметрыКорректны() is CmdlineParameterException ошибка3) throw ошибка3; //List<Enum> группыСочетНабораПарам = наборПараметров.ГруппыСочетаемости; #endregion #region Разбор переданных аргументов командной строки и выделение именованных и позиционных значений Dictionary<string /*имя параметра*/, string /*сырое значение*/> переданныеИменованныеЗнач = []; List<string /*сырое значение*/> переданныеПозиционныеЗнач = []; // Перебор всех аргументов приложения for (int i = 0; i < args.Length; i++) { //string? имяПараметра = наборПараметров.ПолучитьИмя(args[i]); // Именованное значение if (наборПараметров.ПолучитьИмя(args[i]) is string имяПараметра) if (наборПараметров[имяПараметра].ТипЗначения is ТипЗначения.Отсутствующее) переданныеИменованныеЗнач.Add(имяПараметра, string.Empty); else переданныеИменованныеЗнач.Add(имяПараметра, args[++i]); // Позиционное (неименованное) значение else переданныеПозиционныеЗнач.Add(args[i]); } #endregion #region Сокращение групп сочетаемости набора параметров на основе переданных именованных значений foreach (string имяПараметра in переданныеИменованныеЗнач.Keys) { //var группыСочетПараметра = наборПараметров[имяПараметра].ГруппыСочетаемости; //if (наборПараметров.Сократить(имяПараметра) is false) // throw new CmdlineParameterException(Resources.qНесовмПарамУказан.r("param", имяПараметра)); if (наборПараметров.СократитьГруппы(наборПараметров[имяПараметра], true) is CmdlineParameterException ошибка4) throw ошибка4; } #endregion #region Дополнительное сокращение групп сочетаемости набора параметров с учётом параметров с неявными значениями var неявноУказанныеПараметры = from Параметр параметр in наборПараметров where /*параметр.ИмеетИнициальноеЗнач &&*/ !переданныеИменованныеЗнач.ContainsKey(параметр.Имя) where наборПараметров.Соответствует(параметр) select параметр; foreach (Параметр параметр in неявноУказанныеПараметры) { //var маскаНеявногоПараметра = параметр.ГруппыСочетаемости; //if (наборПараметров.Сократить(параметр) is false) // throw new CmdlineParameterException(Resources.qНесовмПарамПредполагается.r("param", параметр.Имя)); if (наборПараметров.СократитьГруппы(параметр, false) is CmdlineParameterException ошибка5) throw ошибка5; } //ГруппыСочетаемостиНабора = группыСочетНабораПарам; #endregion #region Разбор позиционных значений на основе выделенных групп сочетаемости: перевод их в именнованные var возможныеПозиционныеПараметры = (from Параметр параметр in наборПараметров where параметр.Позиция != 0 && наборПараметров.Соответствует(параметр) orderby параметр.Позиция where !переданныеИменованныеЗнач.ContainsKey(параметр.Имя) select параметр.Имя) .ToArray(); // Перебор всех переданных позиционных значений for (int индекс = 0; индекс < переданныеПозиционныеЗнач.Count; индекс++) { if (индекс > возможныеПозиционныеПараметры.Length-1) throw new CmdlineParameterException(Resources.qЛишниеАргументы .r("args", переданныеПозиционныеЗнач.ToArray()[индекс..])); переданныеИменованныеЗнач.Add(возможныеПозиционныеПараметры[индекс], переданныеПозиционныеЗнач[индекс]); } переданныеПозиционныеЗнач.Clear(); #endregion #region Присвоение именованных значений соответствующим полям //try //{ foreach (var (имяПараметра, значениеПараметра) in переданныеИменованныеЗнач) наборПараметров.Присвоить(this, имяПараметра, значениеПараметра); //} //catch (CmdlineParameterException ошибка) //{ // throw ошибка; //} #endregion #region Сброс параметров, не соответствующих группам сочетаемости набора наборПараметров.СброситьНесоответствующие(this, наборПараметров.ГруппыСочетаемости); #endregion #region Проверка наличия значений у обязательных параметров //try //{ наборПараметров.ПроверитьОбязательные(this); //} //catch (CmdlineParameterException ошибка) //{ // throw ошибка; //} #endregion #region Формирование отладочных данных //Dictionary<string, string> отладочныеДанные = []; //foreach (var параметр in наборПараметров) //{ // string текстовоеЗначение; // object? сыроеЗначение = параметр.Поле!.GetValue(this); // if (сыроеЗначение is null) // текстовоеЗначение = string.Empty; // else // { // if (параметр.ТипЗначения is ТипЗначения.Множественное) // текстовоеЗначение = string.Join(" · ", (сыроеЗначение as Array)!.Cast<object>()); // else // текстовоеЗначение = сыроеЗначение.ToString()!; // } // отладочныеДанные.Add(параметр.Имя, текстовоеЗначение); //} //foreach (var (группа, значение) in ГруппыСочетаемостиНабора) // отладочныеДанные.Add($"[{группа}]", значение); //var табуляция = отладочныеДанные.Keys.Max(имяПараметра => имяПараметра.Length); //ОтладочнаяИнформация = string.Empty; //foreach (var (параметр, значение) in отладочныеДанные) // ОтладочнаяИнформация += string.Format($"{{0,{табуляция}}} = {{1}}\n", параметр, значение); #endregion } }