根据C#中的用户输入来解析原始类型
-
10-10-2019 - |
题
我的代码使用我给它的反射和字符串,而不是用户输入。最终,我希望用户能够说“ float”“ 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) });
其他提示
在不使用反射的情况下进行同样的事情:
Console.WriteLine(Convert.ChangeType("42", Type.GetType("System.Int32")));
Console.WriteLine(Convert.ChangeType("42.123", Type.GetType("System.Single")));
为了避免无效类型的例外,您可以做:
string typeStr = "System.Single";
Type type = Type.GetType(typeStr);
if (type != null)
{
Console.WriteLine(Convert.ChangeType("42", type));
}
不隶属于 StackOverflow