我的代码遇到了很多麻烦,我正在尝试制作某种解析器。基本上我试图从JSON文件中获取数据,并使用该数据从我的代码中调用方法。
这是我的JSON文件的基本示例
{ "story": { "Talk": [ "me", 1, 1 ] } }
现在我有一个名为DialogueSystem
的类,它包含一个名为Talk
的函数,其中包含三个参数:string,int,int。
我使用SimpleJSON
来获取我的JSON数据,但我猜它与其他JSON解析器类似。
另外,我还有其他函数有不同的参数,这就是为什么我被迫使用反射
无论如何,这里是获取json数据的代码,并尝试使用Reflection来调用Talk方法。
// Gets the JSON and parses it
JSONNode Node = JSONNode.Parse(jsonFile());
var method = sys.GetType().GetMethod(""); // Reflection stuff
foreach (JSONNode item in Node["story"].Keys) // the Keys just gives me every key that's in the story node/key
{
List<object> parameters = new List<object>(); // List containing the parameters, to be used when invoking the method
for (int i = 0; i < Node["story"][item].Count; i++)
{
//This part tests if it's a string or int and adds it as such
string data = Node["story"][item][i];
int n;
bool isNum = int.TryParse(data, out n);
if (isNum)
{
parameters.Add(n);
}
else
{
parameters.Add(data);
}
}
// Invoke the method using it's method name and the method parameters
method.Invoke(item, parameters.ToArray());
}
顺便说一下,我的Talk
班只根据给定的输入打印文本。
出于某种原因,我收到此错误
NullReferenceException:未将对象引用设置为的实例 object Dialogue.StoryTeller.ReadStory(Dialogue.DialogueSystem sys) (在Assets / Dialogue System / Scripts / StoryTeller.cs:57)
如果你有任何想法如何解决它,或者可能做得更好,那就太棒了!
谢谢!
答案 0 :(得分:0)
您的.getmethod调用使用空字符串。因此,您的methodinfo对象为null。因此例外。 https://msdn.microsoft.com/en-us/library/8zz808e6(v=vs.110).aspx
答案 1 :(得分:0)
好的,在搜索了Microsoft文档和堆栈溢出的各处后,我发现我需要更改两件事。
首先,我必须更改var method = sys.GetType().GetMethod("");
这个var method = sys.GetType().GetMethod(item.ToString().Replace("\"", ""));
(我也在for循环中移动以使用item
)
另外,我需要将调用method.Invoke(item, parameters.ToArray());
更改为此method.Invoke(sys, parameters.ToArray());
所以整个代码现在就是这个
Node = JSONNode.Parse(jsonFile());
foreach (JSONNode item in Node["story"].Keys)
{
List<object> parameters = new List<object>();
var method = sys.GetType().GetMethod(item.ToString().Replace("\"", ""));
for (int i = 0; i < Node["story"][item].Count; i++)
{
string data = Node["story"][item][i];
int n;
bool isNum = int.TryParse(data, out n);
if (isNum)
{
parameters.Add(n);
}
else
{
parameters.Add(data);
}
}
method.Invoke(sys, parameters.ToArray());
}