Frage

Ich arbeite mit einem OPC Server Steuerung, die Daten-Tags als Variantentypen speichert, beschrieben von System.Runtime.InteropServices.VarEnum . Diese Arten umfassen die folgenden, VT_BSTR (string), VT_I2 (kurz) und VT_I4 (lang).

Alle diese Werte gespeichert werden vom Server als Objekte und dann muss ich auf den richtigen Wert werfen, wenn ich sie holen.

Ich weiß, dass ich so etwas wie folgendes tun:

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;

Wo TypedVariant ist eine generische Klasse etwas wie folgt aus:

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;
    }  
}

Aber ist es eine Möglichkeit, sie alle zur Laufzeit tun, das heißt in etwa wie folgt:

TypedVariant<> typedVariant = TypedVariant.Create(VarEnum.VT_BSTR, tagValue);
//typedVariant should now be of type TypedVariant<string>    

Offensichtlich dieser Code wird nicht kompiliert, sondern kann es wie dies geschehen?

Update: gemäß dem Vorschlag von @Konamiman, ich habe die Klasse geändert implizites Casting zu ermöglichen. So können Sie jetzt diesen Code schreiben und es ist alles typsicher, so dass Sie nicht die Variante in einem anderen Typ als die speichern können es erstellt wurde mit.

object objectStr = (object)"testing"; //created this way just for testing        
TypedVariant<string> typedVariant = (string)objectStr;
string actualString = typedVariant;
War es hilfreich?

Lösung

Ich denke, dass der TypedVariant Wrapper eine gute Idee ist, könnte man es dir von / zum umschlossenen Typ des impliziten Konvertierungsoperator außer Kraft zu setzen und dann würden Sie in der Lage sein, es zu benutzen mehr transparent, wie zum Beispiel:

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

Sehen Sie hier: "impliziter" Stichwort Verweis auf MSDN

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top