C#/ JSON - 调用List <object>作为参数

时间:2016-05-01 00:25:16

标签: c# arrays json reflection

我的代码遇到了很多麻烦,我正在尝试制作某种解析器。基本上我试图从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)

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

谢谢!

2 个答案:

答案 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());

}