Ich möchte testen, ob ein gegebenes object
in ein bestimmtes Type
umgewandelt werden kann.
In diesem Szenario habe ich ein Objekt und das Type
repräsentiert den Typ, auf den ich es umwandeln möchte:
Wie kann ich data
auf den Typ type
darstellen?
Grundsätzlich möchte ich das tun:
%Vor% ... aber natürlich können Sie Type
nicht mit einer as
Anweisung verwenden, also was soll ich tun?
Edit 2: Ich werde sagen, dass dies ohne Reflektion oder Generika nicht möglich ist. Bei der Reflektion haben Sie keine Überprüfung der Kompilierungszeit und müssen reflection (oder dynamic
) verwenden, um weitere Methoden / Eigenschaften des Objekts aufzurufen. Mit Generics können Sie ein Type-Objekt nicht verwenden, um allein dorthin zu gelangen. Treffen Sie Ihre Wahl. Ist es möglich, Ihren Anrufcode so umzuformulieren, dass er Generika erlaubt?
Wenn dies erlaubt ist, kann dies einfacher mit einer generischen Methode gehandhabt werden:
%Vor% Bearbeiten: Sie können auch data as T
verwenden, wenn Sie eine generische Typeinschränkung von where T : class
einfügen:
... aber natürlich können Sie Typ nicht mit einer as-Anweisung verwenden, also was soll ich tun?
Wichtiger Hinweis: Sie können var
nicht auf diese Weise verwenden. Also hier gibt es nichts zu gewinnen.
Sie können testen , wenn es der richtige Typ mit
ist %Vor% Aber Sie können immer noch keinen vernünftigen Code schreiben, um auf Eigenschaften oder Methoden auf data
zuzugreifen.
C # liefert das as-Schlüsselwort schnell Bestimmen Sie zur Laufzeit, ob ein bestimmter Typ mit einem anderen kompatibel ist. Wenn Sie das Schlüsselwort as verwenden, können Sie die Kompatibilität ermitteln, indem Sie einen Null-Rückgabewert überprüfen. Berücksichtigen Sie Folgendes:
%Vor%Zusätzlich zum Schlüsselwort as gibt es in der Sprache C # das Schlüsselwort is, um festzustellen, ob zwei Elemente kompatibel sind. Anders als das Schlüsselwort as gibt das Schlüsselwort is jedoch false statt einer Null-Referenz zurück, wenn die Typen inkompatibel sind.
%Vor% Das ist ziemlich schwierig. Das Problem ist, dass var
nicht "Variante" bedeutet. Es verhält sich eher wie ein temporärer Platzhalter, der C # mit einem tatsächlichen Typ füllt, sobald die Typinformation aus dem Ausdruck abgeleitet werden kann. unboxedData
ist immer noch sehr stark eine typisierte Variable. Es ist nur der Compiler versucht, den Typ herauszufinden, anstatt Sie explizit anzugeben. Es ist wichtig zu beachten, dass die Typisierung immer noch zur Kompilierzeit und nicht zur Laufzeit stattfindet.
Wenn Sie ein Objekt zur Laufzeit dynamisch umwandeln möchten, können Sie var
oder einen anderen konkreten Typspezifizierer nicht verwenden.
Ihre Optionen sind auf eine der beiden möglichen Deklarationen beschränkt:
Basierend auf dem, was ich denke , das du mit unboxedData
machen willst. Ich vermute, dass dynamic
die Route ist, die du gehen willst, weil du damit jede Methode auf dem Ziel Type
aufrufen könntest. .
Also hier ist, was ich gefunden habe.
%Vor%Dies erfordert die folgende Erweiterungsmethode.
%Vor%Der Cast funktioniert, wenn eine der folgenden Aussagen zutrifft:
IConvertible
und hat einen Konvertierungspfad zum Zieltyp. Nun, als ich mich umsah, fand ich etwas ... Wie kann geprüft werden, ob eine implizite oder explizite Besetzung vorliegt?
Sei vorsichtig, ich habe es nicht viel getestet, aber auf den ersten Blick scheint es vielversprechend zu sein. Ein großes Negativ ist, dass es die Ausnahme auslöst, wenn es nicht konvertiert werden kann:
%Vor%Ein weiterer nützlicher Link mit dem gleichen Ansatz: Prüft, ob ein Typ eine implizite oder explizite Typkonvertierung in einen anderen Typ mit .NET unterstützt
Tags und Links .net c# type-conversion casting