Frage

Mein Code diese Verwendungen Reflexion und Strings zu tun, dass ich es geben, statt Benutzereingabe. Schließlich mag ich der Benutzer in der Lage sein, „schweben“ zu sagen: „2.0“ und den Computer zu sagen hat, ja, dass ein Schwimmer ist, oder „Bool“ „abc“, die der Computer sagt, dass kein boolean ist es gehört.

Es wäre einfach genug sein, um die Benutzereingabe zu nehmen und es zu einem primitiven Typnamen zu konvertieren, wie „string“ auf „System.String“, „float“ auf „System.Single“ usw. (obwohl, wenn Sie wissen, eine Funktion, das zu tun, das wäre großartig sein.)

Hier ist der 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);  

Aber ich halte eine Null-Ausnahme auf der vorletzten Zeile bekommen. Was ist los da?

War es hilfreich?

Lösung

Aber ich halte eine Null-Ausnahme auf der vorletzten Zeile bekommen. Was ist los da?

Ihr t.GetMethod funktioniert nicht. Das Verfahren wird Parse genannt, nicht das, was Sie geschrieben haben. Es könnte nicht mehr mehrdeutig sein -. Aber das ist nur, weil es jetzt keine Methode und leise kehrt null findet

Um den Anruf eindeutig zu machen, müssen Sie die erwarteten Parametertypen angeben:

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

Andere Tipps

Um das gleiche zu tun, ohne Reflexion mit:

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

eine Ausnahme für einen ungültigen Typen zu vermeiden, könnten Sie tun:

string typeStr = "System.Single";

Type type = Type.GetType(typeStr);

if (type != null)
{
    Console.WriteLine(Convert.ChangeType("42", type));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top