根据c#中的用户输入解析为原始类型
我这样做的代码使用我给它的reflection和字符串,而不是用户输入。 最终我希望用户能够说“浮动”“2.0”并让计算机说,是的,这是一个浮动,或计算机会说的“bool”“abc”,这是没有听说过的布尔值。
获取用户输入并将其转换为基本类型名称是很简单的,例如“string”到“System.String”,“float”到“System.Single”等等(尽管如果你知道一个函数要做到这一点,那也会很棒。)
这是代码:
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);
但是我在第二行到最后一行继续得到一个空例外。 那里发生了什么?
但是我在第二行到最后一行继续得到一个空例外。 那里发生了什么?
你的t.GetMethod
不起作用。 该方法称为Parse
,而不是您编写的内容。 它可能不再含糊不清 – 但这只是因为它现在找不到方法并且默默地返回null
。
要使调用明确,您需要指定预期的参数类型:
MethodInfo mi = t.GetMethod("Parse", new Type[] { typeof(string) });
不使用reflection来做同样的事情:
Console.WriteLine(Convert.ChangeType("42", Type.GetType("System.Int32"))); Console.WriteLine(Convert.ChangeType("42.123", Type.GetType("System.Single")));
为了避免无效类型的exception,您可以这样做:
string typeStr = "System.Single"; Type type = Type.GetType(typeStr); if (type != null) { Console.WriteLine(Convert.ChangeType("42", type)); }