0

System.Runtime.InteropServices.VarEnumで説明されているバリアント型としてデータ タグを格納するOPC サーバーコントロールを使用しています。これらの型には、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;
4

1 に答える 1

1

ラッパーは良いアイデアだと思います。TypedVariantそれを拡張して、ラップされた型との間の暗黙的な変換演算子をオーバーライドすると、次のように、より透過的に使用できるようになります。

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

ここを参照してください: MSDN の「暗黙の」キーワード リファレンス

于 2009-10-30T12:54:28.253 に答える