Analisi di tipi primitivi, in base all'input dell'utente in C #
-
10-10-2019 - |
Domanda
Il mio codice per fare questo utilizza la riflessione e archi che io do, invece di input dell'utente. In ultima analisi vorrei che l'utente sia in grado di dire "galleggiare" "2.0" e avere l'informatica, sì, che è un galleggiante, o "bool" "abc" per cui il computer avrebbe detto, che c'è booleano è sentito parlare.
Sarebbe abbastanza semplice per prendere l'input dell'utente e convertirlo in un nome di tipo primitivo, come "stringa" a "System.String", "galleggiare" a "System.Single", ecc (anche se se si sa di una funzione per fare questo, che sarebbe troppo grande.)
Ecco il codice:
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);
Ma io continuo a ricevere un'eccezione nulla sulla penultima riga. Cosa sta succedendo lì?
Soluzione
Ma io continuo a ricevere un'eccezione nulla sulla penultima riga. Cosa sta succedendo lì?
Il tuo t.GetMethod
non funziona. Il metodo si chiama Parse
, non quello che hai scritto. Non è più potrebbe essere ambiguo -. Ma questo è solo perché la società non trova il metodo e ritorna silenziosamente null
Per effettuare la chiamata inequivocabile, è necessario specificare i tipi di parametri attesi:
MethodInfo mi = t.GetMethod("Parse", new Type[] { typeof(string) });
Altri suggerimenti
Per fare lo stesso senza l'utilizzo di riflessione:
Console.WriteLine(Convert.ChangeType("42", Type.GetType("System.Int32")));
Console.WriteLine(Convert.ChangeType("42.123", Type.GetType("System.Single")));
per evitare un'eccezione per un tipo non valido, si potrebbe fare:
string typeStr = "System.Single";
Type type = Type.GetType(typeStr);
if (type != null)
{
Console.WriteLine(Convert.ChangeType("42", type));
}