C#: проверить Variant до преобразования
Nil, Int64, диапазоны и строгий приём целого без неявного преобразования строк.
Когда нужен Variant
Variant — значение на динамической границе движка: Get/Set, Call и нетипизированные коллекции. Внутри своей модели сохраняйте конкретные C#-типы. Variant не превращает произвольный object, List<T> или DateTime в поддерживаемое движком значение.
| Значение | Представление |
|---|---|
| default(Variant) | Variant.Type.Nil |
| int, long | Variant.Type.Int; извлечение AsInt64, Obj имеет тип long |
| float, double | Variant.Type.Float; Obj имеет тип double |
| int[] | Упакованный массив; AsInt32Array возвращает массив .NET |
| Resource / Entity | Ссылка на объект; проверка времени жизни остаётся необходимой |
VariantType показывает фактическую категорию. Метод As… — операция преобразования, а не проверка схемы. Если нужен именно целочисленный счётчик, сначала проверьте Int, затем диапазон long, только после этого приводите к int.
Законченный проверяющий метод
Добавьте файл как обычный C#-helper; прикреплять его к Entity не нужно. TryRead принимает 25 и 999L; отклоняет −1L, 1000L, 1L << 40, строку «25», число 25.0 и Nil. Выход при отказе равен 0. Вызывающий код должен проверить bool, прежде чем использовать count.
VariantCounter.cs
using Reckfell;
public static class VariantCounter
{
public static bool TryRead(Variant value, out int count)
{
count = 0;
if (value.VariantType != Variant.Type.Int) return false;
long raw = value.AsInt64();
if (raw < 0 || raw > 999) return false;
count = (int)raw;
return true;
}
}В общем стенде результат 25 виден в интерфейсе. Это проверка одного поля, не полный валидатор JSON/сохранений: ключи, размер сообщения, обязательные поля и версии схемы задаются отдельно.
Копии и время жизни
Прочитанный через AsInt32Array массив .NET можно менять независимо: это не запись назад в исходный Variant. Движковые Array/Dictionary, напротив, имеют правила общих ссылок — см. коллекции.
Variant является struct с IDisposable и может удерживать нативные данные. Не освобождайте копию произвольно, если другую копию ещё используют: внутреннее владение может быть общим. Для самостоятельно созданного временного Variant ограничивайте время использования; не вызывайте Dispose у заимствованных значений, которыми ещё владеет другой код. Упаковка Entity в Variant не продлевает её жизнь после Free.