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

È stato utile?

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));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top