2011-01-13 70 views
1

我的代码做到这一点使用反射和字符串,我给它,而不是用户输入。最终,我希望用户能够说“浮动”“2.0”,并让电脑说,是的,这是一个浮点数,或计算机会说的“bool”“abc”,这不是听说的布尔值。解析为基本类型,基于c#中的用户输入#

这将足够简单到接受用户输入并将其转换为基本类型名称,如“字符串”到“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); 

但我不断收到第二空例外最后一行。那里发生了什么?

+0

为什么不使用TryParse?我认为这会简化这一点。 – 2011-01-13 17:11:35

+0

有没有原因,你不能直接使用** Single.Parse(“1.0”)**而不使用反射? – Jeff 2011-01-13 17:13:03

+0

@Chris:Try Parse实际上让我对事情变得更加复杂,有趣的出旗的B/C。 – user420667 2011-01-13 17:14:01

回答

4

但我在倒数第二行得到一个空例外。那里发生了什么?

您的t.GetMethod不起作用。该方法被称为Parse,而不是你写的。它可能不再含糊不清 - 但那只是因为它现在找不到方法,并且默默地返回null

要拨打电话明确的,你需要指定期望的参数类型:不使用反射

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

做相同的:

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