我一直试图解决这个问题,但似乎无法将其弄清楚。这真的让我烦恼,我真的需要帮助。
我尝试修复的错误存在于我用C#编写的一小段代码中,它的任务是删除一个字符串(我将在下面给出示例)并创建一个实例一个类并使用参数调用一个方法(如果在字符串中提供了任何参数),然后分别返回输出。
这是我的代码:
responseData = responseData.Trim(); // To eliminate annoying things in the string
string[] class_method = responseData.Split(new[] { "::" }, StringSplitOptions.None);
Type type = Type.GetType("paper." + class_method[0]);
object instance = Activator.CreateInstance(type);
if (type != null)
{
MethodInfo method = type.GetMethod(class_method[1]);
if (method != null)
{
foreach (string str in responseData.Split(new[] { " " }, StringSplitOptions.None)) {
System.Console.WriteLine("Arg: " + str); // should output something like "Socket::ListenPort TCP 9000"
}
output = Toolkit.byteCode(method.Invoke(instance, null).ToString() + "\n");
}
}
这是应该发生的事情:
我将向此方法提交一个字符串,如下所示:
Socket::PortListener TCP 9000
。我在代码中的目标是在' :: '之前取第一个字符串。 (插座);它将创建一个类的实例" Socket "。然后它将在' :: '之后接受字符串,因此" PortListener "并执行该方法。之后,代码应该获取字符串" TCP 9000 "中的其余参数,并使用这些参数作为参数来调用方法。
接受这些参数的Socket::PortListener
类的一个例子是:
public void PortListener(string type_, int port)
{
return type_ + port;
}
这只是一个例子。但是这个想法是它会根据提供的参数返回输出。
note 我知道它有 null ,其中参数数组应该去。这只是出于测试原因,我需要看到它正确地获取参数并在我更改它以使用参数执行方法之前将它们打印到屏幕上。当你提出修复时,请提前更改。
在此先感谢,如果您需要有关代码如何工作的更多信息或说明,请与我们联系。我仍然是C#的新手,所以我在这方面不是很先进。在此先感谢您的帮助!
答案 0 :(得分:0)
在第一个视图中,我看到一个问题:
如果你有:
var responseData = "Socket::PortListener TCP 9000";
这将返回包含2个字符串的数组:
string[] class_method = responseData.Split(new[] { "::" }, StringSplitOptions.None);
所以这行不能正常工作,因为在class_method [1]中你有 PortListener TCP 9000
MethodInfo method = type.GetMethod(class_method[1]);//this will be null
您需要将class_method[1]
分割为" "
var methodData = class_method[1].Split(new char[0]);
所以最后你的代码看起来像这样:
if (type != null)
{
var methodData = class_method[1].Split(new char[0]);
MethodInfo method = type.GetMethod(methodData[0]);
if (method != null)
{
for(int i=1; i< methodData.Length; i++)
{
string str = methodData[i];
System.Console.WriteLine("Arg: " + str); // should output something like "Socket::ListenPort TCP 9000"
}
output = Toolkit.byteCode(method.Invoke(instance, null).ToString() + "\n");
}
}
只需一个提示:将来使用调试,以避免此类问题。