2012-04-12 16 views
11

Wie kann ich eine Klasse erstellen, die in DateTime umgewandelt werden kann? Aber ich muss meine Klasse besetzen, wenn sie gepackt hat. Zum Beispiel:Wie kann man in C# eine Klasse erstellen, die nach DateTime umgewandelt werden kann?

object date1 = new MyDateTime(); 
DateTime date2 = (DateTime)date1; 

Ich brauche direkt dieses Arbeitsbeispiel.

Ich weiß, wie es geht, aber mein Weg wird ohne Verpackung funktionieren. Ich bin mir nicht sicher, ob es einen Weg dafür gibt.

Bitte, helfen Sie.

PS. Ich muss direkt in DateTime umwandeln. Also, MyDateTime muss vorher gepackt werden. Explizit funktioniert gut, aber es hilft nicht, wenn Sie ein Objekt gepackt haben. Und es werfen müssen nur gewöhnliche Gießens wie

(DateTime) (object) MyDateTime 
+0

Wie beschrieben, dies nicht möglich ist. Sie können 'Convert.ToDateTime' nicht verwenden? Warum muss es eine Objektvariable sein? – Random832

Antwort

29

Was Sie zu sein scheinen nach Vererbung ist, in der Lage zu „speichern“ eine abgeleitete Klasse Instanz in einer Variablen des Basistyp etwa so:

Stream s = new FileStream(); 

Die Tatsache, dass es ein FileStream unter der Haube ist, ist nicht verloren, nur weil Sie darauf mit der Stream Brille auf zeigen.

DateTime ist ein struct und struct Vererbung nicht unterstützt wird - so ist dies nicht möglich.

Ein alternatives ist das explicit Schlüsselwort für user-defined conversions (syntaktisch wie Abgüsse suchen). Dadurch können Sie zumindest zwischen Ihrer Klasse und DateTime mit mehr Zucker wechseln.

http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.71).aspx

Dies aussehen könnte:

class MyDateTime 
{ 
    private DateTime _inner; 

    public static explicit operator DateTime(MyDateTime mdt) 
    { 
     return mdt._inner; 
    } 
} 

Sie können mit dem Gegen implicit Schlüsselwort das gleiche tun:

public static implicit operator DateTime(MyDateTime mdt) 
{ 
    return mdt._inner; 
} 

Das dann können Sie das "Casting" implizit:

DateTime date = new MyDateTime(); 

Eine weitere Alternative besteht darin, DateTime mit einer eigenen Adapterklasse zu versehen, die intern DateTime verwendet und dann von dieser Klasse erbt, um MyDateTime zu erstellen. Anstatt DateTime in Ihrer Codebasis zu verwenden, verwenden Sie diese Adapterklasse.

Ich habe ähnliche Dinge mit SmartDateTime Stil Klassen gesehen, wo die DateTime ein besseres Verständnis von Nullen und wenn es gesetzt wurde.

+0

Es funktioniert nicht für diese Situation –

+0

@EvgenyEkim Was Sie suchen, ist Vererbung dann, wenn Sie einen abgeleiteten Typ in einer Referenz eines Basistyps speichern möchten. Dies ist mit 'DateTime' nicht möglich, da es sich um eine' struct' handelt. –

+0

Ja, du hast Recht. Aber ich weiß nicht, ob es einen Weg ohne Vererbung gibt. –

10

könnten Sie verwenden

class MyDateTime 
{ 
    public static explicit operator DateTime(MyDateTime dt) 
    { 
     return new DateTime(); // Convert dt here    
    } 
} 
0

Sie bräuchten einen expliziten Cast-Operator auf MyDateTime Klasse zu schreiben, die auf für Datum und Uhrzeit in einem der Konstrukteure aufruft.Here's an example.

1

Anstelle einer direkten Umwandlung würde ich eine Erweiterungsmethode erstellen, die die erforderlichen Schritte ausführt, um die Konvertierung abzuschließen. Eine Art der Konvertierung ist notwendig, da DateTime nicht vererbt werden kann, so dass eine direkte Besetzung unmöglich ist.

public static class DateTimeExtensions 
{ 
    public static MyDateTime ToMyDateTime(this DateTime dt) 
    { 
     //conversion logic 
     return myDataTime; 
    } 
    public static DateTime ToDateTime(this MyDateTime mdt) 
    { 
     //conversion logic 
     return dateTime; 
    } 
} 

Auf diese Weise würden Sie den Code wie so verwenden:

DateTime dt = mdt.ToDateTime(); 

oder

MyDateTime mdt = dt.ToMyDateTime();