C #: Wie führe ich 'as' mit einem Type aus?

8

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:

%Vor%

Wie kann ich data auf den Typ type darstellen?

anwenden

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?

    
IEHaterNumber1 21.09.2011, 18:36
quelle

6 Antworten

6

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:

%Vor%     
mellamokb 21.09.2011 18:40
quelle
3
  

... 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.

    
Henk Holterman 21.09.2011 18:44
quelle
2

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%     
Pankaj Upadhyay 21.09.2011 18:45
quelle
1
%Vor%

Sollte Ihnen sagen, ob es genau oder eine Unterklasse von (so kann es in es gegossen werden).

    
hometoast 21.09.2011 18:54
quelle
1

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:

  • Objekt
  • dynamisch

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:

  • Der zu konvertierende Wert implementiert IConvertible und hat einen Konvertierungspfad zum Zieltyp.
  • Der zu konvertierende Wert unterklassifiziert den Zieltyp.
  • Der zu konvertierende Wert definiert einen expliziten Konvertierungsoperator in seiner Klassendeklaration.
Brian Gideon 21.09.2011 20:08
quelle
0

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

    
deepee1 21.09.2011 20:02
quelle

Tags und Links