Analizar a tipos primitivos, en base a la entrada del usuario en c #
-
10-10-2019 - |
Pregunta
Mi código para hacer esta reflexión usos y cadenas que le doy, en lugar de la entrada del usuario. En última instancia, me gustaría que el usuario sea capaz de decir "flotar" "2.0" y tener la palabra equipo, sí, que es un flotador, o "bool" "abc" a la que diría el equipo, que no es booleano que ha oído.
Sería lo suficientemente simple para tomar la entrada del usuario y convertirlo en un nombre de tipo primitivo, como "cadena" a "System.String", "flotar" a "System.Single", etc (aunque si se sabe de una función para hacer eso, que sería grande también.)
Aquí está el código:
Console.WriteLine("1.0 => {0}", System.Single.Parse("1.0")); // this works fine.
Type t = Type.GetType("System.Single"); // for parsing floats
MethodInfo mi = t.GetMethod("System.Single.Parse"); // "ambiguous" if use "Parse"
object[] parameters = new object[] { "1.0" };
float f = (float)(mi.Invoke(null, parameters)); // get null exception here.
Console.WriteLine("Was succesfully parsed to: " + f);
Pero sigo recibiendo una excepción nula en la segunda a la última línea. ¿Qué está pasando allí?
Solución
Pero sigo recibiendo una excepción nula en la segunda a la última línea. ¿Qué está pasando allí?
Su t.GetMethod
no funciona. El método se llama Parse
, no lo que usted escribió. Ya no puede ser ambigua -. Pero eso es sólo porque se encuentra ahora ningún método y vuelve silenciosamente null
Para realizar la llamada inequívoca, es necesario especificar los tipos de parámetros esperados:
MethodInfo mi = t.GetMethod("Parse", new Type[] { typeof(string) });
Otros consejos
Para hacer lo mismo sin necesidad de utilizar la reflexión:
Console.WriteLine(Convert.ChangeType("42", Type.GetType("System.Int32")));
Console.WriteLine(Convert.ChangeType("42.123", Type.GetType("System.Single")));
para evitar una excepción para un tipo no válido, se podría hacer:
string typeStr = "System.Single";
Type type = Type.GetType(typeStr);
if (type != null)
{
Console.WriteLine(Convert.ChangeType("42", type));
}