2012-04-12 14 views
11

Come posso creare una classe, che può essere trasmessa su DateTime. Ma ho bisogno di lanciare la mia lezione, quando è pieno zeppo. Ad esempio:Come creare una classe in C#, che può essere trasmessa su DateTime?

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

Ho bisogno direttamente di questo esempio di lavoro.

So come farlo, ma il mio modo funzionerà senza imballaggio. Non sono sicuro che ci sia un modo per farlo.

Per favore, aiuto.

PS. Ho bisogno di cast direttamente oggetto su DateTime. Quindi, MyDateTime deve essere imballato prima. Funziona bene, ma non aiuta se hai un oggetto compresso. E si deve lanciare solo usando fusione ordinario come

(DateTime) (object) MyDateTime 
+0

Come descritto, questo è impossibile. Non puoi usare 'Convert.ToDateTime'? Perché deve essere una variabile 'object'? – Random832

risposta

29

Quello che sembrano essere dopo è eredità, essendo in grado di "store" un'istanza di classe derivata in una variabile del tipo di base in questo modo:

Stream s = new FileStream(); 

Il fatto che si tratti di un FileStream sotto il cofano non è perso solo perché si sta puntando ad esso con gli occhiali Stream.

DateTime è un struct, e struct eredità non è supportata - quindi questo è non possibile.

Un'alternativa è la parola chiave per la explicituser-defined conversions (sintatticamente cercando come calchi). Ciò ti consente almeno lo scambio tra la tua classe e DateTime con più zucchero.

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

Questo potrebbe apparire come:

class MyDateTime 
{ 
    private DateTime _inner; 

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

Si può fare lo stesso con la parola chiave controparte implicit:

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

Che poi ti permette di fare il "casting" implicitamente:

DateTime date = new MyDateTime(); 

Un'altra alternativa è di avvolgere DateTime con la propria classe di adattatore che utilizza internamente uno DateTime e quindi ereditare da questa classe per creare MyDateTime. Quindi, anziché utilizzare DateTime nella base di codice, si utilizza questa classe di adattatore.

Ho visto cose simili con le classi di stile SmartDateTime in cui lo DateTime ha una migliore comprensione dei valori nulli e se è stato impostato.

+0

Non funziona per questa situazione –

+0

@EvgenyEkim Quello che stai cercando è l'ereditarietà quindi, se vuoi memorizzare un tipo derivato in un riferimento di un tipo di base. Questo non è possibile con 'DateTime' dato che è una' struct'. –

+0

Sì, hai ragione. Ma non so se c'è modo di farlo senza ereditarietà. –

10

Si potrebbe utilizzare

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

Avresti bisogno di scrivere un operatore cast esplicito sulla tua classe MyDateTime che chiama in uno dei costruttori su Datetime.Here's an example.

1

Invece di un cast diretto, vorrei creare un metodo di estensione che esegua i passaggi richiesti per completare la conversione. È necessaria una sorta di conversione, perché DateTime non può essere ereditato da, quindi una trasmissione diretta sarà impossibile.

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

In questo modo, si può usare il codice in questo modo:

DateTime dt = mdt.ToDateTime(); 

o

MyDateTime mdt = dt.ToMyDateTime();