如何围绕Variant值创建一个类型安全的包装器

时间:2009-10-30 11:26:07

标签: c# generics instantiation variant opc

我正在使用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 个答案:

答案 0 :(得分:1)

我认为TypedVariant包装器是一个好主意,您可以扩展它以覆盖隐式转换运算符从/到包装类型然后您将能够更透明地使用它,例如: / p>

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

见这里:"implicit" keyword reference at MSDN