Как сделать безопасную оболочку типа вокруг значений Variant
Я работаю с элементом управления OPC Server, который хранит теги данных как типы вариантов, описанные System.Runtime.InteropServices.VarEnum. Эти типы включают следующие: VT_BSTR (строка), VT_I2 (короткая) и VT_I4 (длинная).
Все эти значения хранятся на сервере как объекты, и затем я должен привести их к правильному значению, когда получу их.
Я знаю, что могу сделать что-то вроде следующего:
object tagValue = (object)"testing"; //this would be returned from a function rather than created this way!!
var typedVariant = new TypedVariant<string>(tagValue);
string actualString = typedVariant.Value;
Где TypedVariant является универсальным классом примерно так:
class TypedVariant<T> where T : class, struct
{
public TypedVariant(object variant)
{
Value = variant as T;
}
public T Value { private set; get; }
public static implicit operator TypedVariant<T> (T m)
{
// code to convert from TypedVariant<T> to T
return new TypedVariant<T>(m);
}
public static implicit operator T (TypedVariant<T> m)
{
// code to convert from T to TypedVariant<T>
return m.Value;
}
}
Но есть ли способ сделать все это во время выполнения, то есть что-то вроде следующего:
TypedVariant<> typedVariant = TypedVariant.Create(VarEnum.VT_BSTR, tagValue);
//typedVariant should now be of type TypedVariant<string>
Очевидно, этот код не будет компилироваться, но можно ли это сделать так?
Обновление: согласно предложению @Konamiman, я изменил класс, чтобы разрешить неявное приведение. Теперь вы можете написать этот код, и он полностью безопасен, поэтому вы не можете сохранить вариант в другом типе, чем тот, в котором он был создан.
object objectStr = (object)"testing"; //created this way just for testing
TypedVariant<string> typedVariant = (string)objectStr;
string actualString = typedVariant;
1 ответ
Я думаю, что TypedVariant
Обертка - хорошая идея, вы можете расширить ее, чтобы переопределить оператор неявного преобразования из / в обернутый тип, и тогда вы сможете использовать его более прозрачно, например:
var typedVariant = (string)tagValue;
string actualString = typedVariant;
Смотрите здесь: "неявная" ссылка на ключевое слово на MSDN