¿Hay alguna manera de hacer que este método sea genérico para que pueda devolver una cadena, bool, int o double? En este momento, está devolviendo una cadena, pero si puede encontrar "verdadero" o "falso" como el valor de configuración, me gustaría devolver un bool, por ejemplo.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
c#
.net
generics
return-type
MacGyver
fuente
fuente
dynamic
palabra clave. Hay un costo de rendimiento para eso, pero para leer un archivo de configuración, el costo de rendimiento es casi ciertamente insignificante.Respuestas:
Debe convertirlo en un método genérico, como este:
Pero la persona que llama tendrá que especificar el tipo que espera. A continuación, podría utilizar
Convert.ChangeType
, suponiendo que todos los tipos relevantes son compatibles:No estoy completamente convencido de que todo esto sea una buena idea, eso sí ...
fuente
ConfigSettingString
,ConfigSettingBool
, etc.) tiene la ventaja de código de método que será más corta, más clara y mejor enfocado .Podrías usar
Convert.ChangeType()
:fuente
Hay muchas formas de hacerlo (enumeradas por prioridad, específicas para el problema del OP)
Opción 1: enfoque directo: cree varias funciones para cada tipo que espera en lugar de tener una función genérica.
Opción 2: cuando no desee utilizar métodos sofisticados de conversión : convierta el valor en objeto y luego en tipo genérico.
Nota: Esto arrojará un error si el lanzamiento no es válido (su caso). No recomendaría hacer esto si no está seguro sobre el tipo de conversión, prefiera la opción 3.
Opción 3: Genérico con seguridad de tipo : cree una función genérica para manejar la conversión de tipo.
Nota: T es el tipo esperado, tenga en cuenta la restricción where aquí (el tipo de U debe ser IConvertible para salvarnos de los errores)
fuente
U
? No tiene sentido hacerlo, y hace que sea más difícil llamar al método. Solo acepta en suIConvertible
lugar. No creo que valga la pena incluir la segunda opción para esta pregunta dado que no responde a la pregunta que se hace. Probablemente también debería cambiar el nombre del método en la primera opción ...Debe convertir el tipo de valor de retorno del método al tipo genérico que pasa al método durante la llamada.
Debe pasar un tipo que sea de tipo castable para el valor que devuelve a través de ese método.
Si desea devolver un valor que no es de tipo casteable al tipo genérico que pasa, es posible que deba modificar el código o asegurarse de pasar un tipo que sea casteable para el valor de retorno del método. Por lo tanto, este enfoque no se recomienda.
fuente
return (T)Convert.ChangeType(number, typeof(T));
era exactamente lo que me faltaba - aplausosCree una función y pase el parámetro put como de tipo genérico.
fuente
Por favor, intente debajo del código:
fuente
Estaba realizando esto en todo mi código y quería una forma de ponerlo en un método. Quería compartir esto aquí porque no tuve que usar Convert.ChangeType para mi valor de retorno. Puede que esta no sea una buena práctica, pero funcionó para mí. Este método toma una matriz de tipo genérico y un valor para agregar al final de la matriz. La matriz se copia con el primer valor eliminado y el valor tomado en el método se agrega al final de la matriz. Lo último es que devuelvo la matriz genérica.
fuente