Question

Mon code pour ce faire utilise la réflexion et les cordes que je lui donne, au lieu de l'entrée utilisateur. En fin de compte, je voudrais que l'utilisateur puisse dire « flotter » « 2.0 » et avoir le informatique, oui, c'est un flotteur, ou « bool » « abc » auquel l'ordinateur dirait, c'est pas booléen il a entendu parler.

Il serait assez simple de prendre l'entrée d'utilisateur et le convertir en un nom de type primitif, comme « string » à « System.String », « flottant » à « System.Single », etc. (bien que si vous connaissez d'une fonction de le faire, ce serait génial aussi.)

Voici le code:

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);  

Mais je continue à obtenir une exception nulle sur la seconde dernière ligne. Que se passe là-bas?

Était-ce utile?

La solution

  

Mais je continue à obtenir une exception nulle sur la seconde dernière ligne. Que se passe là-bas?

Votre t.GetMethod ne fonctionne pas. La méthode est appelée Parse, pas ce que vous avez écrit. Il ne peut plus être ambiguë -. Mais c'est seulement parce qu'il trouve maintenant aucune méthode et retourne en silence null

Pour faire l'appel sans ambiguïté, vous devez spécifier les types de paramètres attendus:

MethodInfo mi = t.GetMethod("Parse", new Type[] { typeof(string) });

Autres conseils

Pour faire la même chose sans utiliser la réflexion:

Console.WriteLine(Convert.ChangeType("42", Type.GetType("System.Int32")));
Console.WriteLine(Convert.ChangeType("42.123", Type.GetType("System.Single")));

pour éviter une exception pour un type non valide, vous pouvez faire:

string typeStr = "System.Single";

Type type = Type.GetType(typeStr);

if (type != null)
{
    Console.WriteLine(Convert.ChangeType("42", type));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top