2010-08-24 28 views
13

tengo el siguiente método (simplificado):moldeada en el método genérico para DateTime

private static string GetStringFromValue<T>(T val) 
{ 
    if (typeof(T) == typeof(DateTime)) 
    { 
     return string.Format("{0}", ((DateTime)val).Year.ToString("0000")); 
    } 
    return string.Empty; 
} 

En el elenco "(DateTime) val" me sale el siguiente error:

Cannot cast expression of Type 'T' to type 'DateTime'

Lo ¿Puedo hacer para acceder a la propiedad Year del parámetro DateTime?

ACTUALIZACIÓN: Gracias por todas sus respuestas rápidas. Este método (y el nombre del método) está realmente (!) Simplificado para mostrar exactamente mi problema y para permitir que todos copien & pegándolo en su propio estudio visual. Es solo que quería agregar algunos valores específicos de Tipo si el tipo es un DateTime. Además de eso, el 99% del método es el mismo.

+1

¿Por qué está escribiendo 'String, Format (" {0} ", algo)'? – SLaks

+0

No solo eso. 'something.ToString()'. – recursive

+0

El año no es el único valor que quiero obtener. Pero simplifiqué el método. ¿O es incorrecto que use String.Format en absoluto? Tiene un rendimiento y legibilidad mucho mejores que: x.Year + ":" + x.Month + ":" + ..... – Chris

Respuesta

24

cambiarlo a

return string.Format("{0:yyyy}", val); 

Para responder a la pregunta, el compilador no se da cuenta de que es TDateTime.
Para realizar este reparto, es necesario emitir a través object, así:

return ((DateTime)(object)val).Year.ToString("0000"); 
+5

Por supuesto, si transfiere el objeto, hay un paso de boxeo y unboxing en curso. –

+0

@James: AFAIK, no hay forma de evitar eso sin hacer un método diferente. – SLaks

+1

Estoy de acuerdo, pero debe tenerse en cuenta. –

1

SLaks tipos más rápido que yo. :)

Pero permítanme agregar: es posible que desee volver a pensar su implementación, aquí, en función de lo que está tratando de lograr. Supongo que la razón para tener un método genérico GetStringFromValue es emitir cadenas específicas de varios tipos. Pero eso terminará en un lío una vez que hay, digamos, una docena de tipos diferentes allí.

Si son tipos de sistema, como DateTime, string.Format() probablemente pueda manejarlos todos, con las cadenas de formato apropiadas. Si son sus propios tipos, considere anular sus métodos ToString().

De cualquier forma, un poco más de detalle sobre el problema que está resolviendo generaría respuestas interesantes.

6

Sé que dijo el ejemplo se ha simplificado, pero consideran que el manejo de esta manera:

private static string GetStringFromValue(DateTime val) 
{ 
    return string.Format("{0}", val.Year.ToString("0000")); 
} 

private static string GetStringFromValue<T>(T val) 
{ 
    return string.Empty; 
} 

La sobrecarga DateTime es la mejor opción cuando se pasa un DateTime real, y la versión genérica será utilizado para Everthing más. (Incluso podría omitir el genérico para el segundo y simplemente usar un Objeto)

+0

upvote para los métodos separados para cada tipo. Sin embargo, ¿sería mejor usar {0: aaaa}? –

+0

o simplemente val.ToString ("yyyy") –

+1

@gbogumil: val.ToString ("yyyy") - Esto me dará el error: El método 'ToString' tiene 0 parámetro (s) pero se invoca con 1 argumento (s) – Chris

Cuestiones relacionadas