Tengo un código de capa de acceso a datos que llama a un proceso almacenado y devuelve valores escalares de varios tipos de datos. La sintaxis es ExecuteDecimal, ExecuteString, etc. Yo quiero que sea Execute<string>
o Execute<decimal>
¿Cómo hago para que los genéricos funcionen con valores devueltos que requieren un casting cuidadoso?
Intento esta aplicación y no puedo compilar, a menos que yo estoy haciendo la fundición a "valor (T)", si intento verifica el tipo y llama a un método para hacer el casting, sin tanta suerte.
pregunta ACTUALIZADA ¿Por qué tengo que convertir a objeto antes de convertir a T?
código actualizado
internal T Execute<T>(string storedProcName, Hashtable parameters)
{
//Next lines do compile (thanks to suggestions from answers!)
if (typeof(T) == typeof(string))
return (T) (object) ExecuteScalar(storedProcName, parameters).ToString();
else if (typeof(T) == typeof(int))
return (T)(object) Convert.ToInt32(ExecuteScalar(storedProcName, parameters));
//Next line compiles, but not all things boxed in an object can
//be converted straight to type T (esp db return values that might contain DbNull.Value, etc)
return (T)ExecuteScalar(storedProcName, parameters);
}
hey, estoy realmente preocupado. las primeras tres respuestas (con los votos más altos) son con errores o están hinchadas con código innecesario. – Andrey
@Andrey, bienvenido a SO = (Estoy decepcionado de no aprender sobre 'casting cuidadoso'. Estaba tan emocionado cuando leí el título. =) – Marc