private IElementSearchConfiguration GetSearchConfigurationByAttributes(MemberInfo pageMember, IElement parentElement)
        {
            var    pageMemberAttributes = pageMember.GetCustomAttributes(false);
            FindBy locator = GetLocator(pageMemberAttributes);

            if (locator != null)
            {
                FilterBy[] filters = GetFilters(pageMemberAttributes);
                IElementSearchConfiguration searchConfiguration =
                    DependencyManager.Kernel.Get <IElementSearchConfiguration>(DependencyManager.Tool.ToString());
                searchConfiguration.FindBy(locator).FilterBy(filters).From(parentElement);
                return(searchConfiguration);
            }
            return(null);
        }
        private IContainer InitializeComplexControl(MemberInfo pageMember, IElement commonContainerElement)
        {
            //IElement containerElementForComplexControl = GetElementByAttributes(pageMember, commonContainerElement);
            IElementSearchConfiguration searchConfiguration = GetSearchConfigurationByAttributes(pageMember,
                                                                                                 commonContainerElement);
            IElement containerElementForComplexControl = DependencyManager.Kernel.Get <IElement>();

            containerElementForComplexControl.SearchConfiguration = searchConfiguration;

            Type       complexControlType = pageMember.GetUnderlyingType();
            MethodInfo getPageMethod      = (typeof(PageFactoryBase)).GetMethod("Create").MakeGenericMethod(complexControlType);

            object[]   getPageMethodArguments = { containerElementForComplexControl };
            IContainer complexControlInstance = (IContainer)getPageMethod.Invoke(this, getPageMethodArguments);

            return(complexControlInstance);
        }
        public TPageType Create <TPageType>(IElement commonContainerElement = null) where TPageType : IContainer, new()
        {
            TPageType requestedPage     = new TPageType();
            Type      requestedPageType = typeof(TPageType);

            IEnumerable <MemberInfo> pageMembers = ExtractPageMembers(requestedPageType);

            foreach (MemberInfo pageMember in pageMembers)
            {
                if (IsAComplexControl(pageMember))
                {
                    IContainer complexControlInstance = InitializeComplexControl(pageMember, commonContainerElement);
                    switch (pageMember.MemberType)
                    {
                    case MemberTypes.Field: ((FieldInfo)pageMember).SetValue(requestedPage, complexControlInstance); break;

                    case MemberTypes.Property: ((PropertyInfo)pageMember).SetValue(requestedPage, complexControlInstance); break;
                    }
                }
                if (IsAnElement(pageMember))
                {
                    IElementSearchConfiguration searchConfiguration = GetSearchConfigurationByAttributes(pageMember,
                                                                                                         commonContainerElement);
                    Type expectedElementType     = pageMember.GetUnderlyingType();
                    var  expectedElementInstance = Activator.CreateInstance(expectedElementType);
                    ((IElement)expectedElementInstance).SearchConfiguration = searchConfiguration;

                    switch (pageMember.MemberType)
                    {
                    case MemberTypes.Field:
                        ((FieldInfo)pageMember).SetValue(requestedPage, expectedElementInstance);
                        break;

                    case MemberTypes.Property:
                        ((PropertyInfo)pageMember).SetValue(requestedPage, expectedElementInstance);
                        break;
                    }

                    #region InstantiateElementOfProperType

                    //Type elementType = pageMember.GetUnderlyingType();
                    //Type baseElementType = DependencyManager.Kernel.Get<IElement>().GetType();

                    //var concreteElementTemplate = Activator.CreateInstance(elementType);
                    //var concreteElementInstance = elementInstance.ShallowConvert<>(concreteElementTemplate);

                    //Type elementType = pageMember.GetUnderlyingType();
                    //var serializedParent = JsonConvert.SerializeObject(elementInstance);
                    //var deserializedChild = JsonConvert.DeserializeObject(serializedParent, elementType);

                    //var concreteElementInstance = Activator.CreateInstance(elementType);
                    //elementInstance.ShallowConvert(concreteElementInstance);
                    //((IElement) concreteElementInstance).SearchConfiguration = elementInstance.SearchConfiguration;

                    //switch (pageMember.MemberType)
                    //    {
                    //        case MemberTypes.Field:
                    //            //elementInstance
                    //            //((FieldInfo)pageMember).SetValue(requestedPage, elementInstance);
                    //            ((FieldInfo)pageMember).SetValue(requestedPage, deserializedChild);
                    //            break;
                    //        case MemberTypes.Property: ((PropertyInfo)pageMember).SetValue(requestedPage, elementInstance); break;
                    //    }

                    #endregion
                }
            }
            return(requestedPage);
        }