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