Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于c中的用户输入解析到基元类型#_C#_Reflection_Types_Invoke_Methodinfo - Fatal编程技术网

C# 基于c中的用户输入解析到基元类型#

C# 基于c中的用户输入解析到基元类型#,c#,reflection,types,invoke,methodinfo,C#,Reflection,Types,Invoke,Methodinfo,我的代码使用反射和我提供的字符串,而不是用户输入。最终,我希望用户能够说“float”“2.0”,让计算机说,是的,这是一个float,或者计算机会说的“bool”“abc”,这不是听说过的布尔值 获取用户输入并将其转换为基本类型名称非常简单,如“string”到“System.string”、“float”到“System.Single”等(尽管如果您知道一个函数可以这样做,那也很好) 代码如下: Console.WriteLine("1.0 => {0}", System.Single

我的代码使用反射和我提供的字符串,而不是用户输入。最终,我希望用户能够说“float”“2.0”,让计算机说,是的,这是一个float,或者计算机会说的“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) });
但在倒数第二行我一直得到一个空异常。那里发生了什么事

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

要在不使用反射的情况下执行相同操作,请执行以下操作:

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

为什么不使用TryParse?我想这会简化很多。有什么原因不能直接使用Single.Parse(“1.0”)而不使用反射吗?@Chris:试试Parse实际上会让事情变得更复杂,这是有趣的标志。@Jeff:问题的第一句和第二句。@Jeff:原因是,我希望能够让用户提供类型。我想我可以根据用户输入做一个长的switch语句,但这似乎不是很优雅。为什么不使用TryParse呢?我想这会简化很多。有什么原因不能直接使用Single.Parse(“1.0”)而不使用反射吗?@Chris:试试Parse实际上会让事情变得更复杂,这是有趣的标志。@Jeff:问题的第一句和第二句。@Jeff:原因是,我希望能够让用户提供类型。我想我可以根据用户的输入做一个长的switch语句,但这似乎不是很优雅。我们有一个赢家!谢谢(我知道那个模棱两可的解析语句有点可笑,只是没弄明白。)谢谢。我们赢了!谢谢(我知道那个模棱两可的解析语句有点可笑,只是没弄明白。)谢谢。太好了。又好又短,太好了。那又好又短。