- Регистрация
- 03.05.2016
- Сообщения
- 733
- Благодарностей
- 485
- Баллы
- 63
Всем привет! С вами Дмитрий!
В данном кейсе я расскажу, как можно быстро и удобно работать с Входными настройками, используя C#.
Вдохновлялся я данной статьей: Нестандартные подходы к разработке шаблонов.
В статье очень хорошо описывается, как, используя "Метод расширения" добавлять нужный нам функционал к уже имеющемуся в ZennoPoster. Тем самым мы можем значительно упростить однообразную работу при написание шаблонов.
Если мы посмотрим документацию по работе с "Входными настройками" ILocalVariable, то для работы мы видим 4 свойства, из которых мы работаем только с одним Value, который возвращает данные из переменных ZennoPoster с типом данных string. А для работы нам часто нужны и другие типы данных, например, int или bool. Поэтому постоянно приходится в коде преобразовывать данные из входных настроек в нужный тип данных. А что, если мы, используя метод расширения, дополним наш интерфейс ILocalVariable своими методами, которые будут преобразовывать в нужный тип данных, а еще проверять это преобразование? Будет очень удобно!
Представляю вашему вниманию сниппет для работы с "Входными настройками"
Ссылка на Git
Как его установить.
Описание методов.
#####################
Мой Телеграм Канал
Мой Youtube Канал
Личный блог на Форуме
Поддержка автора: Донат
#####################
В данном кейсе я расскажу, как можно быстро и удобно работать с Входными настройками, используя C#.
Вдохновлялся я данной статьей: Нестандартные подходы к разработке шаблонов.
В статье очень хорошо описывается, как, используя "Метод расширения" добавлять нужный нам функционал к уже имеющемуся в ZennoPoster. Тем самым мы можем значительно упростить однообразную работу при написание шаблонов.
Если мы посмотрим документацию по работе с "Входными настройками" ILocalVariable, то для работы мы видим 4 свойства, из которых мы работаем только с одним Value, который возвращает данные из переменных ZennoPoster с типом данных string. А для работы нам часто нужны и другие типы данных, например, int или bool. Поэтому постоянно приходится в коде преобразовывать данные из входных настроек в нужный тип данных. А что, если мы, используя метод расширения, дополним наш интерфейс ILocalVariable своими методами, которые будут преобразовывать в нужный тип данных, а еще проверять это преобразование? Будет очень удобно!
Представляю вашему вниманию сниппет для работы с "Входными настройками"
Ссылка на Git
C#:
public static class LocalVariableExt
{
private static readonly Random _random = new Random();
/// <summary>
/// Преобразует значение string в целочисленное значение (int).
/// Выбрасывает FormatException, если преобразование не удалось.
/// </summary>
/// <returns>Целочисленное значение (int).</returns>
public static int ToInt(this string value)
{
return int.TryParse(value, out int result) ? result :
throw new FormatException($"Значение переменной \"{value}\" не может быть преобразовано в тип данных Int.");
}
/// <summary>
/// Преобразует значение локальной переменной в целочисленное значение (int).
/// Выбрасывает FormatException, если преобразование не удалось.
/// </summary>
/// <returns>Целочисленное значение преобразованной переменной (int).</returns>
public static int ToInt(this ILocalVariable variable)
{
return int.TryParse(variable.Value, out int result) ? result :
throw new FormatException($"Значение переменной \"{variable.Name}\" не может быть преобразовано в тип данных Int.");
}
/// <summary>
/// Преобразует значение локальной переменной в логическое значение (bool).
/// Выбрасывает FormatException, если преобразование не удалось.
/// </summary>
/// <returns>Логическое значение преобразованной переменной (bool).</returns>
public static bool ToBool(this ILocalVariable variable)
{
if (!bool.TryParse(variable.Value, out bool result))
{
throw new FormatException($"Значение переменной \"{variable.Name}\" не может быть преобразовано в тип данных Bool.");
}
return result;
}
/// <summary>
/// Преобразует значение переменной с разделителями в массив строк.
/// </summary>
/// <param name="separator">Разделитель для разбиения строки (по умолчанию ',').</param>
/// <returns>Строковый массив значений после разделения.</returns>
public static string[] MultiSelectToArray(this ILocalVariable variable, char separator = ',')
{
var value = variable.Value;
if (value.Contains(separator))
{
return value.Split(separator)
.Select(s => s.Trim())
.ToArray();
}
else return new string[] { value.Trim() };
}
/// <summary>
/// Считывает значения из файла, каждую строку файла преобразует в элемент списка.
/// </summary>
/// <returns>Список строк, прочитанных из файла.</returns>
public static List<string> ToList(this ILocalVariable variable)
{
return File.ReadAllLines(variable.Value).ToList();
}
/// <summary>
/// Получает случайное целочисленное значение из заданного диапазона значений переменной либо из максимального значения.
/// Выбрасывает FormatException, если значение переменной не соответствует формату диапазона.
/// </summary>
/// <returns>Случайное целое число в заданном диапазоне или из максимального значения (int).</returns>
public static int GetRandomInt(this ILocalVariable variable)
{
var values = variable.Value;
if (values.Contains("-"))
{
var parts = values.Split('-');
if (parts.Length == 2 && int.TryParse(parts[0], out var minValue) && int.TryParse(parts[1], out var maxValue))
{
return _random.Next(minValue, maxValue + 1);
}
else
{
throw new FormatException($"Некорректный формат диапазона переменной \"{variable.Name}\"");
}
}
else return _random.Next(variable.ToInt());
}
/// <summary>
/// Обрабатывает текст с использованием спинтаксиса для создания различных комбинаций.
/// </summary>
/// <returns>Текст после обработки спинтаксиса.</returns>
public static string Spintax(this ILocalVariable variable)
{
return TextProcessing.Spintax(variable.Value);
}
/// <summary>
/// Проверяет значение переменной на наличие данных, выбрасывает исключение, если значение пустое.
/// </summary>
/// <param name="exceptionMessage">Сообщение исключения, если значение пустое (не обязательно).</param>
/// <returns>Тот же экземпляр для цепочки вызовов.</returns>
public static ILocalVariable ExceptionEmpty(this ILocalVariable variable, string exceptionMessage = null)
{
if (string.IsNullOrWhiteSpace(variable.Value))
{
throw new Exception(exceptionMessage ?? $"Переменная \"{variable.Name}\" не имеет данных.");
}
return variable;
}
/// <summary>
/// Проверяет существование файла и его содержимое.
/// Выбрасывает исключение, если файл не найден или пустой в зависимости от параметра ExceptionIfEmpty.
/// </summary>
/// <param name="ExceptionIfEmpty">Проверка на пустой файл.</param>
/// <returns>Тот же экземпляр для цепочки вызовов.</returns>
public static ILocalVariable ExceptionFile(this ILocalVariable variable, bool ExceptionIfEmpty = true)
{
string message;
var value = variable.Value;
if (!File.Exists(value))
{
message = string.Format("Файл \"{0}\" не найден", value);
throw new Exception(message);
}
if(ExceptionIfEmpty && new FileInfo(value).Length == 0)
{
message = string.Format("Файл \"{0}\" пустой", value);
throw new Exception(message);
}
return variable;
}
/// <summary>
/// Проверяет существование директории и её содержимое.
/// Выбрасывает исключение, если директория не найдена или пустая в зависимости от параметра ExceptionIfEmpty.
/// </summary>
/// <param name="ExceptionIfEmpty">Проверка на пустую директорию.</param>
/// <returns>Тот же экземпляр для цепочки вызовов.</returns>
public static ILocalVariable ExceptionDirectory(this ILocalVariable variable, bool ExceptionIfEmpty = true)
{
string message;
var value = variable.Value;
if (!Directory.Exists(value))
{
message = string.Format("Директория \"{0}\" не найден", value);
throw new Exception(message);
}
if (ExceptionIfEmpty && !Directory.EnumerateFileSystemEntries(value).Any())
{
message = string.Format("Директория \"{0}\" пустая", value);
throw new Exception(message);
}
return variable;
}
}
Как его установить.
1 этап, копируем код и вставляем в "Общий код"
Вот так:
Код уже работает, мы можем использовать его в своем шаблоне. Но постоянно его копировать не хочется! Поэтому переходим к ...
2 этап, сохраняем сниппет для удобной загрузки в других шаблонах.
Нажимаем плюсик, чтобы свернуть код, выделяем строку, правой кнопкой мыши вызываем меню и сохраняем в C# сниппет.
Теперь, если нам нужно быстро добавить данный сниппет в наш новый шаблон, выполняем первый этап, только вместо копировать вставить, правой кнопкой мыши вызываем меню и добавляем наш сниппет. Все готово, можно работать.
Вот так:
Код уже работает, мы можем использовать его в своем шаблоне. Но постоянно его копировать не хочется! Поэтому переходим к ...
2 этап, сохраняем сниппет для удобной загрузки в других шаблонах.
Нажимаем плюсик, чтобы свернуть код, выделяем строку, правой кнопкой мыши вызываем меню и сохраняем в C# сниппет.
Теперь, если нам нужно быстро добавить данный сниппет в наш новый шаблон, выполняем первый этап, только вместо копировать вставить, правой кнопкой мыши вызываем меню и добавляем наш сниппет. Все готово, можно работать.
Описание методов.
Метод ToInt() преобразовывает тип данных string в тип данных int.
Пример: из "2" получаем 2
Метод ToBool() преобразовывает тип данных string в тип данных bool.
Пример: из "True" получаем true
Метод MultiSelectToArray(char separator = ',') преобразовывает тип данных string в тип данных string[], по умолчанию разделяя через ',' но можно выставить свой разделитель. Данный метод предназначен для удобной работы с Входными настройками типом DropDownMultiSelect. Мы сразу же получаем массив данных, чтобы в дальнейшем с ними работать.
Пример: из данных переменной Array{item1|item2|item3} получаем массив item.
Метод ToList() берет путь до файла из Входных настроек и получает из файла список строк. Важно! Проверок в методе нет, нужно самостоятельно контролировать путь к файлу.
Метод GetRandomInt() получает случайное число из диапазона значений.
Пример: в переменной значение "1-100" получаем рандом 56 или в переменной одно число "100" получаем рандом 47.
Метод Spintax() обрабатывает текст с использованием спинтаксиса для создания различных комбинаций. Важно! Проверок в методе нет, нужно самостоятельно контролировать данные.
Пример: в переменной значение "{item1|item2|item3|item4|item5|item6}" получаем рандом item3
Группа методов для проверки значений переменных.
Метод ExceptionEmpty() проверяет значение переменной на наличие данных, выбрасывает исключение, если значение пустое. Есть аргумент exceptionMessage, где мы можем прописать свое сообщение при исключение. Если оставить пустым — будет выбрасывать исключение: $"Переменная \"{variable.Name}\" не имеет данных."
Пример: если для нас важно, чтобы во Входных настройках переменная имела значение, прописываем ее проверку, если переменная будет пустая — шаблон выкинет исключение и остановит работу.
Метод ExceptionFile(bool ExceptionIfEmpty = true) проверяет существование файла и его содержимое. Аргумент ExceptionIfEmpty отвечает за проверку пустого файла, по умолчанию True, если надо отключить — ставим False.
Пример: Нам нужно проверить, что по указанному пути есть файл и он не пустой, иначе выкинем исключение и остановим работу.
Метод ExceptionDirectory(bool ExceptionIfEmpty = true) проверяет существование директории и файлы внутри нее. Аргумент ExceptionIfEmpty отвечает за проверку пустого директории, по умолчанию True, если надо отключить — ставим False.
Пример: нам нужно проверить, что по указанному пути есть директория и она не пустая, иначе выкинем исключение и остановим работу.
Пример: из "2" получаем 2
C#:
//Пример 1
int numb = project.Variables["numb"].ToInt();
//Пример 2
string value = "2";
int numb = value.ToInt();
Пример: из "True" получаем true
C#:
//Пример 1
bool isNull = project.Variables["null"].ToBool();
Пример: из данных переменной Array{item1|item2|item3} получаем массив item.
C#:
//Пример 1
string[] arrItem= project.Variables["items"].MultiSelectToArray();
C#:
//Пример 1
List<string>lstAccount = project.Variables["pathFile"].ToList();
Пример: в переменной значение "1-100" получаем рандом 56 или в переменной одно число "100" получаем рандом 47.
C#:
//Пример 1
int random = project.Variables["range"].GetRandomInt();
Пример: в переменной значение "{item1|item2|item3|item4|item5|item6}" получаем рандом item3
C#:
//Пример 1
string item = project.Variables["items"].Spintax();
Метод ExceptionEmpty() проверяет значение переменной на наличие данных, выбрасывает исключение, если значение пустое. Есть аргумент exceptionMessage, где мы можем прописать свое сообщение при исключение. Если оставить пустым — будет выбрасывать исключение: $"Переменная \"{variable.Name}\" не имеет данных."
Пример: если для нас важно, чтобы во Входных настройках переменная имела значение, прописываем ее проверку, если переменная будет пустая — шаблон выкинет исключение и остановит работу.
C#:
//Пример 1
project.Variables["value"].ExceptionEmpty();
//Пример 2
project.Variables["value2"].ExceptionEmpty("Свой текст ошибки");
Пример: Нам нужно проверить, что по указанному пути есть файл и он не пустой, иначе выкинем исключение и остановим работу.
C#:
//Пример 1
project.Variables["pathFile"].ExceptionFile();
Пример: нам нужно проверить, что по указанному пути есть директория и она не пустая, иначе выкинем исключение и остановим работу.
C#:
//Пример 1
project.Variables["pathDir"].ExceptionDirectory();
#####################
Мой Телеграм Канал
Мой Youtube Канал
Личный блог на Форуме
Поддержка автора: Донат
#####################
Последнее редактирование: