根据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)); }