2016-05-01 18 views
0

我在我的代码有很多麻烦,我试图做某种解析器。基本上我试图从JSON文件中获取数据,并使用该数据从我的代码中调用方法。C#/ JSON - 调用一个列表<object>作为参数的方法

这是我的JSON文件

{ "story": { "Talk": [ "me", 1, 1 ] } } 

的一个基本的例子现在我有一类叫做DialogueSystem,它含有一种叫Talk有三个参数,字符串,INT,INT功能。

我正在使用SimpleJSON来获取我的JSON数据,但我猜测它与其他JSON解析器相似。

另外,我有这有不同的参数,这就是为什么我不得不使用反射

不管怎么说,这里是一个获取JSON数据的代码,并尝试使用反射来调用通话方法等功能。

// 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()); 

} 

btw,我的Talk类只是基于给定的输入打印文本。

出于某种原因,我得到这个错误

的NullReferenceException:未设置为一个 对象Dialogue.StoryTeller.ReadStory(Dialogue.DialogueSystem SYS)的实例对象引用 (在资产/对话系统/ Scripts/StoryTeller.cs:57)

如果你有任何想法如何解决它,或者可能做得更好,那太棒了!

谢谢!

回答

0

好吧,经过搜索无处不在的微软文档和堆栈溢出,我发现我需要改变两件事。

首先,我不得不改变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()); 

} 
+0

我只能在2天内将它标记为答案,所以我现在要说它 – PandawanFr

0

您的.getmethod调用使用空字符串。因此您的methodinfo对象为null。因此例外。 https://msdn.microsoft.com/en-us/library/8zz808e6(v=vs.110).aspx

+0

甚至将其更改为这个 后var method = sys.GetType()。GetMethod(item.ToString());' 它不起作用......我仍然得到错误,并且它告诉我错误来自此行 '方法。 Invoke(item,parameters.ToArray());' – PandawanFr

相关问题