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í?

¿Fue útil?

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));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top