Variant値のタイプセーフラッパーを作成する方法
-
22-07-2019 - |
質問
データタグをバリアントタイプとして保存する 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
ラッパーは良いアイデアだと思います。それを拡張して、ラップされた型との間で暗黙的な変換演算子をオーバーライドすることができます。 as:
var typedVariant = (string)tagValue;
string actualString = typedVariant;
こちらをご覧ください:&quot; implicit&quot; MSDNのキーワードリファレンス
所属していません StackOverflow