Как сделать типобезопасную оболочку вокруг значений Variant

StackOverflow https://stackoverflow.com/questions/1649264

Вопрос

Я работаю с сервером OPC , в котором теги данных хранятся как варианты типов, описывается 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;
Это было полезно?

Решение

Я думаю, что обертка TypedVariant - хорошая идея, вы можете расширить ее, чтобы переопределить оператор неявного преобразования из / в упакованный тип, и тогда вы сможете использовать его более прозрачно, например как:

var typedVariant = (string)tagValue;
string actualString = typedVariant;

Смотрите здесь: " неявный " ссылка на ключевое слово в MSDN

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top