public static UnityPluginParameter ParseUnityPluginParameter(
            Configs.UnityPlugins configs, Configs.UnityManagedPluginProject projectConfig)
        {
            Ensure.Argument.NotNull(configs, nameof(configs));
            Ensure.Argument.NotNull(projectConfig, nameof(projectConfig));

            StringToVersionInfo versions = null;

            if (projectConfig.ForMultipleVersions)
            {
                versions = projectConfig.Versions ?? new StringToVersionInfo();
                foreach (var kvp in configs.DefaultVersions)
                {
                    var ver  = kvp.Key;
                    var info = kvp.Value;
                    if (!versions.ContainsKey(ver))
                    {
                        versions.Add(ver, info);
                    }
                }
            }

            var parameter = new UnityPluginParameter
            {
                ForEditor = projectConfig.ForEditor,
                Versions  = versions?.ToDictionary(p => UnityVersion.Parse(p.Key), p => p.Value)
            };

            return(parameter);
        }
        public static void SetupUnityPluginProject(VSProject project, UnityPluginParameter parameter)
        {
            Ensure.Argument.NotNull(project, nameof(project));
            Ensure.Argument.NotNull(parameter, nameof(parameter));

            var versions = parameter.Versions;

            if (versions == null)
            {
                return;
            }

            project.RemovePropertyGroups(project.ParseConditionalConfigurationPropertyGroups((string)null));
            project.RemoveItemGroups(project.ParseConditionalConfigurationItemGroups((string)null));

            var propertyGroupAnchor = project.DefaultPropertyGroup;
            var itemGroupAnchor     = project.DefaultReferenceGroup;

            foreach (var kvp in versions)
            {
                var ver  = kvp.Key;
                var info = kvp.Value;

                foreach (var type in EnumTraits <ProjectConfigurationType> .Values)
                {
                    SetupConfigurationGroupForUnity(
                        propertyGroupAnchor = project.CreatePropertyGroupAfter(propertyGroupAnchor),
                        type, parameter.ForEditor, ver);

                    var references = info.AssemblyReferences;
                    if (!CollectionUtil.IsNullOrEmpty(references))
                    {
                        SetupReferenceGroupForUnity(
                            itemGroupAnchor = project.CreateItemGroupAfter(itemGroupAnchor),
                            type, parameter.ForEditor, ver, references);
                    }
                }
            }
        }