public IEnumerator <int> GetEnumerator()
        {
            Type      wizardNodeType         = typeof(WizardNode);
            FieldInfo mainNodeField          = wizardNodeType.GetField("mainWizard", BindingFlags.NonPublic | BindingFlags.Instance);
            FieldInfo firstImageWizardField  = wizardNodeType.GetField("firstImageWizard", BindingFlags.NonPublic | BindingFlags.Instance);
            FieldInfo secondImageWizardField = wizardNodeType.GetField("secondImageWizard", BindingFlags.NonPublic | BindingFlags.Instance);
            FieldInfo idWizardNodeField      = wizardNodeType.GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);

            Type      wizardType    = typeof(Wizard);
            FieldInfo idWizardField = wizardType.GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);

            for (int i = 0; i < (this.nodeList.Count / 2); i++)
            {
                WizardNode current       = nodeList[i];
                int        idCurrentNode = (int)idWizardNodeField.GetValue(current);

                IWizard mainWizardCurrent = (IWizard)mainNodeField.GetValue(current);
                int     idParentWizard    = (int)idWizardField.GetValue(mainWizardCurrent);

                WizardNode firstImageWizardCurrent = (WizardNode)firstImageWizardField.GetValue(current);
                int        firstChildWizard        = (int)idWizardNodeField.GetValue(firstImageWizardCurrent);

                WizardNode secondImageWizardCurrent = (WizardNode)secondImageWizardField.GetValue(current);
                int        secondChildWizard        = (int)idWizardNodeField.GetValue(secondImageWizardCurrent);

                if (i == 0)
                {
                    yield return(idParentWizard);
                }

                yield return(firstChildWizard);

                yield return(secondChildWizard);
            }
        }
        private void SetSecondWizardNodeLeaf(WizardNode nodeRoot, WizardNode nodeLeaf)
        {
            Type      wizardNodeType  = typeof(WizardNode);
            FieldInfo wizardNodeField = wizardNodeType.GetField("secondImageWizard", BindingFlags.NonPublic | BindingFlags.Instance);

            wizardNodeField.SetValue(nodeRoot, nodeLeaf);
        }
        private WizardNode CreatWizardNode(IWizard wizard)
        {
            Type            wizardNodeType    = typeof(WizardNode);
            ConstructorInfo nodeCostructor    = wizardNodeType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(IWizard) }, null);
            WizardNode      wizardNode        = (WizardNode)nodeCostructor.Invoke(new object[] { wizard });
            FieldInfo       idWizardNodeField = wizardNodeType.GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);

            idWizardNodeField.SetValue(wizardNode, count);
            this.nodeList.Add(wizardNode);
            return(wizardNode);
        }
        private void SetWizardLeaf(WizardNode node)
        {
            IWizard    wizard1             = MakeWizardWithID(node);
            WizardNode wizardNodeFirstLeaf = CreatWizardNode(wizard1);

            SetFirstWizardNodeLeaf(node, wizardNodeFirstLeaf);

            IWizard    wizard2 = MakeWizardWithID(node);
            WizardNode wizardNodeSecondLeaf = CreatWizardNode(wizard2);

            SetSecondWizardNodeLeaf(node, wizardNodeSecondLeaf);
        }
        private IWizard MakeWizardWithID(WizardNode rootNode)
        {
            IWizard   wizard     = new BasicWizard();
            Type      wizardType = typeof(Wizard);
            FieldInfo idField    = wizardType.GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);

            idField.SetValue(wizard, ++count);

            Type      wizardNodeType  = typeof(WizardNode);
            IWizard   rootWizard      = (IWizard)wizardNodeType.GetField("mainWizard", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(rootNode);
            FieldInfo magicPowerField = wizardType.GetField("magicPower", BindingFlags.NonPublic | BindingFlags.Instance);

            magicPowerField.SetValue(wizard, (int)magicPowerField.GetValue(rootWizard) / 2);

            return(wizard);
        }
 public WizardTree(IWizard root)
 {
     this.nodeList = new List <WizardNode>();
     this.root     = CreatWizardNode(root);
 }