2012-04-12 7 views
11

¿Cómo puedo hacer clase, que se puede convertir a DateTime. Pero necesito lanzar mi clase, cuando empacó. Por ejemplo:¿Cómo hacer clase en C#, que se puede convertir a DateTime?

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

Necesito directamente este ejemplo de trabajo.

Sé cómo hacerlo, pero a mi manera funcionará sin embalaje. No estoy seguro de que haya forma de hacerlo.

Por favor, ayuda.

PS. Necesito lanzar directamente el objeto a DateTime. Por lo tanto, MyDateTime tiene que estar lleno antes. Explícito funciona bien, pero no ayuda si tiene un objeto empaquetado. Y se tienen que desechar simplemente mediante fundición ordinaria como

(DateTime) (object) MyDateTime 
+0

Como se ha descrito, esto es imposible. No puede usar 'Convert.ToDateTime'? ¿Por qué tiene que ser una variable 'objeto'? – Random832

Respuesta

29

Lo que parece ser después es herencia, ser capaz de "tienda" una instancia de la clase derivada de una variable del tipo de base de este modo:

Stream s = new FileStream(); 

El hecho de que sea un FileStream debajo del capó no se pierde simplemente porque lo está apuntando con las gafas Stream encendidas.

DateTime es una struct, y no es compatible struct herencia - por lo que este es no posible.

Una alternativa es la palabra clave para explicituser-defined conversions (sintácticamente mirando como moldes). Esto le permite al menos intercambiar entre su clase y DateTime con más azúcar.

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

Esto podría verse como:

class MyDateTime 
{ 
    private DateTime _inner; 

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

Usted puede hacer lo mismo con la contraparte implicit palabra clave:

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

que luego le permite hacer el "casting" de forma implícita:

DateTime date = new MyDateTime(); 

Otra alternativa es envolverDateTime con su propia clase adaptador que utiliza internamente una DateTime y luego heredar de esta clase para crear MyDateTime. Luego, en lugar de usar DateTime en su base de código, usa esta clase de adaptador.

He visto cosas similares con las clases de estilo SmartDateTime donde el DateTime tiene una mejor comprensión de los nulos y si se configuró.

+0

No funciona en esta situación –

+0

@EvgenyEkim Lo que está buscando es herencia, si desea almacenar un tipo derivado en una referencia de tipo base. Esto no es posible con 'DateTime' ya que es una' struct'. –

+0

Sí, tienes razón. Pero no sé, hay forma de hacerlo sin herencia. –

10

Usted podría utilizar

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

Se necesitaría escribir un operador de conversión explícita en su clase MyDateTime que pone en uno de los constructores de fecha y hora.Here's an example.

1

En lugar de una conversión directa, crearía un método de extensión que realice los pasos necesarios para completar la conversión. Se necesita algún tipo de conversión, porque DateTime no se puede heredar, por lo que un lanzamiento directo será imposible.

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

De esta manera, se utiliza el código de este modo:

DateTime dt = mdt.ToDateTime(); 

o

MyDateTime mdt = dt.ToMyDateTime();