【问题标题】:How to make a type safe wrapper around Variant values如何围绕 Variant 值创建类型安全的包装器
【发布时间】:2009-10-30 11:26:06
【问题描述】:

我正在使用 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;

【问题讨论】:

    标签: c# generics instantiation variant opc


    【解决方案1】:

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

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

    请看这里:"implicit" keyword reference at MSDN

    【讨论】:

    • 这是个好主意,谢谢。自从我发布这个问题以来,我一直想知道我是否真的想在运行时决定这一切。我事先知道标签及其数据类型,因此在编译时知道这一切并不是什么大问题。不过我会拭目以待,看看有没有其他建议。
    猜你喜欢
    • 2020-02-22
    • 2011-09-30
    • 1970-01-01
    • 2019-01-21
    • 2021-03-26
    • 2018-04-12
    • 2011-06-13
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多