构造函数中的C#Foreach循环迭代一次

时间:2018-07-02 10:19:07

标签: c# json json.net

我正在制作自定义JSON文件编辑器。 为了更好地管理数据,我想创建一棵树。 为了使用它们管理数据,默认的JToken和JObject对我来说太复杂了。这就是为什么我要将从输入文件创建的JObject转换为树的原因。

我的代码的基本原理是: 您将JToken传递给Container对象的构造函数; 容器对象包含List(类型为Container)child_containers; 如果JToken是复杂的而不是原始的,它将遍历所有子JToken JToken and它使用该子JToken创建新的Container,并将其添加到child_containers列表。如果输入JToken是原始的,它将保存其值并停止递归。

public class Container
{
    protected GraphicalBlock graphicalBlock;
    //Universal usage
    protected bool IsOriginObject;

    //For primitive containers
    protected object PrimitiveContent;

    //For complex containers
    protected Container child_container;
    protected List<Container> child_elements;

    /// <summary>
    /// Constructor when provided with raw jobject will create a tree that allows easy data managment.
    /// Constructor is only called once, after that the whole tree will be created recusivly
    /// </summary>
    /// <param name="input_jobject"></param>
    /// <param name="Is_orig_obj"></param>
    public Container(JToken input_jobject, Point loc, Form main_form_ref, bool Is_orig_obj=true)
    {
        IsOriginObject = Is_orig_obj;

        //Check for complex vs primitive
        if(input_jobject.HasValues)
        {
            //Populate children list with next level/tier tokens
            //Every token will execute the same procedure eventualy creating a tree
            //The main container is the origin of the tree, primitive containers are the end of the branches
            int i = 0;
            JObject job = input_jobject as JObject;
            foreach (KeyValuePair<string, JToken> pair in job)
            {
                child_elements.Add(new Container(pair.Value, new Point(loc.X + i, loc.Y+120) ,main_form_ref, false));
                i=+120;
            }

            graphicalBlock = new GraphicalBlock(loc, true, main_form_ref, this);
        }
        else
        {
            //If token is primitive we can extract value from it
            PrimitiveContent = input_jobject.ToObject<object>();
            graphicalBlock = new GraphicalBlock(loc, false, main_form_ref, this);
        }
    }
}

graphicalBlock对象只是我用于添加GUI的精美包装。 我不认为这会影响循环。

主要问题是在第一次迭代和创建第一个子容器之后,循环以某种方式中断。有人可以解释为什么第一个令牌后foreach循环中断吗? (没有输入的JToken仅包含1个值)。

如果有人对我的代码有任何疑问,请不要犹豫。 我的问题非常具体,因此我无法在Google上或使用搜索工具找到它。

1 个答案:

答案 0 :(得分:0)

与线

protected List<Container> child_elements;

您要声明一个类型为List<Container>的名称为“ child_element”的字段,但是尚未创建(实例化)列表。因此,该字段的默认值为null

然后您尝试向该“列表”中添加一些内容

child_elements.Add(new Container(...

您成功创建了该子容器,但由于添加的列表不存在而失败。您可能会得到一个被隐藏的NullReferenceException(在调用者处尝试/捕获?)。

解决方案:通过这样声明来确保该字段确实包含列表:

protected List<Container> child_elements = new List<Container>();