public ProjectItem FindProjectItem(object property, FindProjectProperty findProjectProperty, bool createIfNotFound = true)
        {
            ProjectItem        found;
            List <ProjectItem> projList = ProjectsList.ToList();

            switch (findProjectProperty)
            {
            case FindProjectProperty.UniqueName:
                var uniqueName = (string)property;
                found = projList.Find(item => item.UniqueName == uniqueName);
                break;

            case FindProjectProperty.FullName:
                var fullName = (string)property;
                found = projList.Find(item => item.FullName == fullName);
                break;

            case FindProjectProperty.ProjectObject:
                found = projList.Find(item => ReferenceEquals(item.StorageProject, property));
                break;

            case FindProjectProperty.UniqueNameProjectDefinition:
            {
                var projDef = (UniqueNameProjectDefinition)property;
                found = projList.Find(item => item.UniqueName == projDef.UniqueName &&
                                      item.Configuration == projDef.Configuration &&
                                      PlatformsIsEquals(item.Platform, projDef.Platform));
            }
            break;

            case FindProjectProperty.FullNameProjectDefinition:
            {
                var projDef = (FullNameProjectDefinition)property;
                found = projList.Find(item => item.FullName == projDef.FullName &&
                                      item.Configuration == projDef.Configuration &&
                                      PlatformsIsEquals(item.Platform, projDef.Platform));
            }
            break;

            default:
                throw new ArgumentOutOfRangeException("findProjectProperty");
            }

            if (found != null)
            {
                return(found);
            }

            Project proj;

            switch (findProjectProperty)
            {
            case FindProjectProperty.UniqueName:
                var uniqueName = (string)property;
                proj = SolutionItem.StorageSolution.GetProject(item => item.UniqueName == uniqueName);
                break;

            case FindProjectProperty.FullName:
                var fullName = (string)property;
                proj = SolutionItem.StorageSolution.GetProject(item => item.FullName == fullName);
                break;

            case FindProjectProperty.ProjectObject:
                proj = SolutionItem.StorageSolution.GetProject(item => ReferenceEquals(item, property));
                break;

            case FindProjectProperty.UniqueNameProjectDefinition:
            {
                var projDef = (UniqueNameProjectDefinition)property;
                proj = SolutionItem.StorageSolution.GetProject(item => item.UniqueName == projDef.UniqueName &&
                                                               item.ConfigurationManager.ActiveConfiguration.ConfigurationName == projDef.Configuration &&
                                                               PlatformsIsEquals(item.ConfigurationManager.ActiveConfiguration.PlatformName, projDef.Platform));
            }
            break;

            case FindProjectProperty.FullNameProjectDefinition:
            {
                var projDef = (FullNameProjectDefinition)property;
                proj = SolutionItem.StorageSolution.GetProject(item => item.FullName == projDef.FullName &&
                                                               item.ConfigurationManager.ActiveConfiguration.ConfigurationName == projDef.Configuration &&
                                                               PlatformsIsEquals(item.ConfigurationManager.ActiveConfiguration.PlatformName, projDef.Platform));
            }
            break;

            default:
                throw new ArgumentOutOfRangeException("findProjectProperty");
            }

            if (proj == null)
            {
                return(null);
            }

            var newProjItem = new ProjectItem(proj);

            ProjectsList.Add(newProjItem);
            return(newProjItem);
        }