private void RemoveObsoleteValues(POCO.Config poco, EarlyBoundGeneratorConfig @default) { if (CrmSvcUtilRelativePath == @"Plugins\CrmSvcUtil Ref\crmsvcutil.exe" || CrmSvcUtilRelativePath == @"CrmSvcUtil Ref\crmsvcutil.exe") { // 12.15.2016 XTB changed to use use the User directory, no plugin folder needed now // 3.12.2019 Nuget Stopped liking spaces in the CrmSvcUtilFolder. Updated to be the plugin specific DLaB.EarlyBoundGenerator CrmSvcUtilRelativePath = @default.CrmSvcUtilRelativePath; } foreach (var value in poco.ExtensionArguments.Where(a => string.Equals(a.Value, "DLaB.CrmSvcUtilExtensions.Entity.OverridePropertyNames,DLaB.CrmSvcUtilExtensions", StringComparison.InvariantCultureIgnoreCase)).ToList()) { // Pre 2.13.2016, this was the default value. Replaced with a single naming service that both Entities and OptionSets can use poco.ExtensionArguments.Remove(value); } // Pre 2.13.2016, this was the default value. Not Needed Anymore var old = "OpportunityProduct.OpportunityStateCode,opportunity_statuscode|" + "OpportunityProduct.PricingErrorCode,qooi_pricingerrorcode|" + "ResourceGroup.GroupTypeCode,constraintbasedgroup_grouptypecode"; if (string.Equals(poco.ExtensionConfig.PropertyEnumMappings, old, StringComparison.InvariantCultureIgnoreCase) || string.Equals(poco.ExtensionConfig.PropertyEnumMappings, old + "|", StringComparison.InvariantCultureIgnoreCase)) { poco.ExtensionConfig.PropertyEnumMappings = string.Empty; } }
private static void UpdateObsoleteSettings(POCO.Config poco, POCO.ExtensionConfig pocoConfig, EarlyBoundGeneratorConfig @default) { if (new Version(poco.Version) < new Version("1.2016.6.1")) { // Storing of UnmappedProperties and EntityAttributeSpecified Names switched from Key,Value1,Value2|Key,Value1,Value2 to Key:Value1,Value2|Key:Value1,Value2 // Also convert from a List to a HashSet pocoConfig.EntityAttributeSpecifiedNames = ConvertNonColonDelimitedDictionaryListToDictionaryHash(pocoConfig.EntityAttributeSpecifiedNames); pocoConfig.UnmappedProperties = ConvertNonColonDelimitedDictionaryListToDictionaryHash(pocoConfig.UnmappedProperties); } if (new Version(poco.Version) < new Version("1.2018.9.12")) { // Update the OptionSet codecustomization Argument Setting to use the new Generic Code Customziation Service var oldValue = poco.ExtensionArguments.FirstOrDefault( a => a.SettingType == CreationType.OptionSets && a.Name == "codecustomization"); var newValue = @default.ExtensionArguments.FirstOrDefault( a => a.SettingType == CreationType.OptionSets && a.Name == "codecustomization"); if (oldValue != null && newValue != null) { poco.ExtensionArguments.Remove(oldValue); poco.ExtensionArguments.Add(newValue); } } }
/// <summary> /// Initializes a new instance of the <see cref="EarlyBoundGeneratorConfig"/> class. /// </summary> /// <param name="poco">The poco.</param> /// <param name="filePath">The file path.</param> private EarlyBoundGeneratorConfig(POCO.Config poco, string filePath) { var @default = GetDefault(); var defaultConfig = @default.ExtensionConfig; var pocoConfig = poco.ExtensionConfig; CrmSvcUtilRelativePath = poco.CrmSvcUtilRelativePath ?? @default.CrmSvcUtilRelativePath; RemoveObsoleteValues(poco, @default); AudibleCompletionNotification = poco.AudibleCompletionNotification.GetValueOrDefault(@default.AudibleCompletionNotification); IncludeCommandLine = poco.IncludeCommandLine.GetValueOrDefault(@default.IncludeCommandLine); MaskPassword = poco.MaskPassword.GetValueOrDefault(@default.MaskPassword); UpdateObsoleteSettings(poco, pocoConfig, @default); ExtensionConfig = new ExtensionConfig { ActionPrefixesToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.ActionPrefixesToSkip, defaultConfig.ActionPrefixesToSkip), ActionPrefixesWhitelist = AddPipeDelimitedMissingDefaultValues(pocoConfig.ActionPrefixesWhitelist, defaultConfig.ActionPrefixesWhitelist), ActionsWhitelist = AddPipeDelimitedMissingDefaultValues(pocoConfig.ActionsWhitelist, defaultConfig.ActionsWhitelist), ActionsToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.ActionsToSkip, defaultConfig.ActionsToSkip), AddDebuggerNonUserCode = pocoConfig.AddDebuggerNonUserCode.GetValueOrDefault(defaultConfig.AddDebuggerNonUserCode), AddNewFilesToProject = pocoConfig.AddNewFilesToProject.GetValueOrDefault(defaultConfig.AddNewFilesToProject), CreateOneFilePerAction = pocoConfig.CreateOneFilePerAction.GetValueOrDefault(defaultConfig.CreateOneFilePerAction), CreateOneFilePerEntity = pocoConfig.CreateOneFilePerEntity.GetValueOrDefault(defaultConfig.CreateOneFilePerEntity), CreateOneFilePerOptionSet = pocoConfig.CreateOneFilePerOptionSet.GetValueOrDefault(defaultConfig.CreateOneFilePerOptionSet), EntitiesToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.EntitiesToSkip, defaultConfig.EntitiesToSkip), EntitiesWhitelist = AddPipeDelimitedMissingDefaultValues(pocoConfig.EntitiesWhitelist, defaultConfig.EntitiesWhitelist), EntityAttributeSpecifiedNames = AddMissingDictionaryHashDefaultValues(pocoConfig.EntityAttributeSpecifiedNames, defaultConfig.EntityAttributeSpecifiedNames), EntityPrefixesToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.EntityPrefixesToSkip, defaultConfig.EntityPrefixesToSkip), EntityPrefixesWhitelist = AddPipeDelimitedMissingDefaultValues(pocoConfig.EntityPrefixesWhitelist, defaultConfig.EntityPrefixesWhitelist), GenerateActionAttributeNameConsts = pocoConfig.GenerateActionAttributeNameConsts.GetValueOrDefault(defaultConfig.GenerateActionAttributeNameConsts), GenerateAttributeNameConsts = pocoConfig.GenerateAttributeNameConsts.GetValueOrDefault(defaultConfig.GenerateAttributeNameConsts), GenerateAnonymousTypeConstructor = pocoConfig.GenerateAnonymousTypeConstructor.GetValueOrDefault(defaultConfig.GenerateAnonymousTypeConstructor), GenerateEntityRelationships = pocoConfig.GenerateEntityRelationships.GetValueOrDefault(defaultConfig.GenerateEntityRelationships), GenerateEnumProperties = pocoConfig.GenerateEnumProperties.GetValueOrDefault(defaultConfig.GenerateEnumProperties), GenerateOnlyReferencedOptionSets = pocoConfig.GenerateOnlyReferencedOptionSets.GetValueOrDefault(defaultConfig.GenerateOnlyReferencedOptionSets), InvalidCSharpNamePrefix = pocoConfig.InvalidCSharpNamePrefix ?? defaultConfig.InvalidCSharpNamePrefix, MakeAllFieldsEditable = pocoConfig.MakeAllFieldsEditable ?? defaultConfig.MakeAllFieldsEditable, MakeReadonlyFieldsEditable = pocoConfig.MakeReadonlyFieldsEditable ?? defaultConfig.MakeReadonlyFieldsEditable, MakeResponseActionsEditable = pocoConfig.MakeResponseActionsEditable ?? defaultConfig.MakeResponseActionsEditable, LocalOptionSetFormat = pocoConfig.LocalOptionSetFormat ?? defaultConfig.LocalOptionSetFormat, OptionSetLanguageCodeOverride = pocoConfig.OptionSetLanguageCodeOverride ?? defaultConfig.OptionSetLanguageCodeOverride, OptionSetPrefixesToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.OptionSetPrefixesToSkip, defaultConfig.OptionSetPrefixesToSkip), OptionSetsToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.OptionSetsToSkip, defaultConfig.OptionSetsToSkip), ProjectNameForEarlyBoundFiles = pocoConfig.ProjectNameForEarlyBoundFiles ?? defaultConfig.ProjectNameForEarlyBoundFiles, PropertyEnumMappings = AddPipeDelimitedMissingDefaultValues(pocoConfig.PropertyEnumMappings, defaultConfig.PropertyEnumMappings), RemoveRuntimeVersionComment = pocoConfig.RemoveRuntimeVersionComment.GetValueOrDefault(defaultConfig.RemoveRuntimeVersionComment), UnmappedProperties = AddMissingDictionaryHashDefaultValues(pocoConfig.UnmappedProperties, defaultConfig.UnmappedProperties), UseDeprecatedOptionSetNaming = pocoConfig.UseDeprecatedOptionSetNaming.GetValueOrDefault(defaultConfig.UseDeprecatedOptionSetNaming), UseTfsToCheckoutFiles = pocoConfig.UseTfsToCheckoutFiles.GetValueOrDefault(defaultConfig.UseTfsToCheckoutFiles), UseXrmClient = pocoConfig.UseXrmClient.GetValueOrDefault(defaultConfig.UseXrmClient) }; ExtensionArguments = AddMissingArguments(poco.ExtensionArguments, @default.ExtensionArguments); UserArguments = AddMissingArguments(poco.UserArguments, @default.UserArguments); SettingsVersion = string.IsNullOrWhiteSpace(poco.Version) ? "0.0.0.0" : poco.Version; Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); }
/// <summary> /// Initializes a new instance of the <see cref="EarlyBoundGeneratorConfig"/> class. /// </summary> /// <param name="poco">The poco.</param> /// <param name="filePath">The file path.</param> private EarlyBoundGeneratorConfig(POCO.Config poco, string filePath) { var @default = GetDefault(); var defaultConfig = @default.ExtensionConfig; var pocoConfig = poco.ExtensionConfig; CrmSvcUtilRelativePath = poco.CrmSvcUtilRelativePath ?? @default.CrmSvcUtilRelativePath; RemoveObsoleteValues(poco, @default); AudibleCompletionNotification = poco.AudibleCompletionNotification.GetValueOrDefault(@default.AudibleCompletionNotification); IncludeCommandLine = poco.IncludeCommandLine.GetValueOrDefault(@default.IncludeCommandLine); MaskPassword = poco.MaskPassword.GetValueOrDefault(@default.MaskPassword); if (new Version(poco.Version) < new Version("1.2016.6.1")) { // Storing of UnmappedProperties and EntityAttributeSpecified Names switched from Key,Value1,Value2|Key,Value1,Value2 to Key:Value1,Value2|Key:Value1,Value2 // Also convert from a List to a HashSet pocoConfig.EntityAttributeSpecifiedNames = ConvertNonColonDelimitedDictionaryListToDictionaryHash(pocoConfig.EntityAttributeSpecifiedNames); pocoConfig.UnmappedProperties = ConvertNonColonDelimitedDictionaryListToDictionaryHash(pocoConfig.UnmappedProperties); } if (new Version(poco.Version) > Assembly.GetExecutingAssembly().GetName().Version) { } ExtensionConfig = new ExtensionConfig { ActionsToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.ActionsToSkip, defaultConfig.ActionsToSkip), AddDebuggerNonUserCode = pocoConfig.AddDebuggerNonUserCode.GetValueOrDefault(defaultConfig.AddDebuggerNonUserCode), AddNewFilesToProject = pocoConfig.AddNewFilesToProject.GetValueOrDefault(defaultConfig.AddNewFilesToProject), CreateOneFilePerAction = pocoConfig.CreateOneFilePerAction.GetValueOrDefault(defaultConfig.CreateOneFilePerAction), CreateOneFilePerEntity = pocoConfig.CreateOneFilePerEntity.GetValueOrDefault(defaultConfig.CreateOneFilePerEntity), CreateOneFilePerOptionSet = pocoConfig.CreateOneFilePerOptionSet.GetValueOrDefault(defaultConfig.CreateOneFilePerOptionSet), EntitiesToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.EntitiesToSkip, defaultConfig.EntitiesToSkip), EntityAttributeSpecifiedNames = AddMissingDictionaryHashDefaultValues(pocoConfig.EntityAttributeSpecifiedNames, defaultConfig.EntityAttributeSpecifiedNames), GenerateActionAttributeNameConsts = pocoConfig.GenerateActionAttributeNameConsts.GetValueOrDefault(defaultConfig.GenerateActionAttributeNameConsts), GenerateAttributeNameConsts = pocoConfig.GenerateAttributeNameConsts.GetValueOrDefault(defaultConfig.GenerateAttributeNameConsts), GenerateAnonymousTypeConstructor = pocoConfig.GenerateAnonymousTypeConstructor.GetValueOrDefault(defaultConfig.GenerateAnonymousTypeConstructor), GenerateEntityRelationships = pocoConfig.GenerateEntityRelationships.GetValueOrDefault(defaultConfig.GenerateEntityRelationships), GenerateEnumProperties = pocoConfig.GenerateEnumProperties.GetValueOrDefault(defaultConfig.GenerateEnumProperties), InvalidCSharpNamePrefix = pocoConfig.InvalidCSharpNamePrefix ?? defaultConfig.InvalidCSharpNamePrefix, MakeReadonlyFieldsEditable = pocoConfig.MakeReadonlyFieldsEditable ?? defaultConfig.MakeReadonlyFieldsEditable, MakeResponseActionsEditable = pocoConfig.MakeResponseActionsEditable ?? defaultConfig.MakeResponseActionsEditable, LocalOptionSetFormat = pocoConfig.LocalOptionSetFormat ?? defaultConfig.LocalOptionSetFormat, OptionSetsToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.OptionSetsToSkip, defaultConfig.OptionSetsToSkip), PropertyEnumMappings = AddPipeDelimitedMissingDefaultValues(pocoConfig.PropertyEnumMappings, defaultConfig.PropertyEnumMappings), RemoveRuntimeVersionComment = pocoConfig.RemoveRuntimeVersionComment.GetValueOrDefault(defaultConfig.RemoveRuntimeVersionComment), UnmappedProperties = AddMissingDictionaryHashDefaultValues(pocoConfig.UnmappedProperties, defaultConfig.UnmappedProperties), UseDeprecatedOptionSetNaming = pocoConfig.UseDeprecatedOptionSetNaming.GetValueOrDefault(defaultConfig.UseDeprecatedOptionSetNaming), UseTfsToCheckoutFiles = pocoConfig.UseTfsToCheckoutFiles.GetValueOrDefault(defaultConfig.UseTfsToCheckoutFiles), UseXrmClient = pocoConfig.UseXrmClient.GetValueOrDefault(defaultConfig.UseXrmClient) }; ExtensionArguments = AddMissingArguments(poco.ExtensionArguments, @default.ExtensionArguments); UserArguments = AddMissingArguments(poco.UserArguments, @default.UserArguments); SettingsVersion = string.IsNullOrWhiteSpace(poco.Version) ? "0.0.0.0" : poco.Version; Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); }
/// <summary> /// Initializes a new instance of the <see cref="Config"/> class. /// </summary> /// <param name="poco">The poco.</param> /// <param name="filePath">The file path.</param> private Config(POCO.Config poco, string filePath) { var @default = GetDefault(); var defaultConfig = @default.ExtensionConfig; var pocoConfig = poco.ExtensionConfig; CrmSvcUtilRelativePath = poco.CrmSvcUtilRelativePath ?? @default.CrmSvcUtilRelativePath; if (CrmSvcUtilRelativePath == @"CrmSvcUtil Ref\crmsvcutil.exe") { // 5.14.2015 XTB changed to use the Plugins Directory, but then MEF changed Paths to be realtive to Dll. CrmSvcUtilRelativePath = @default.CrmSvcUtilRelativePath; } IncludeCommandLine = poco.IncludeCommandLine.GetValueOrDefault(@default.IncludeCommandLine); MaskPassword = poco.MaskPassword.GetValueOrDefault(@default.MaskPassword); ExtensionConfig = new ExtensionConfig { ActionsToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.ActionsToSkip, defaultConfig.ActionsToSkip), AddDebuggerNonUserCode = pocoConfig.AddDebuggerNonUserCode.GetValueOrDefault(defaultConfig.AddDebuggerNonUserCode), AddNewFilesToProject = pocoConfig.AddNewFilesToProject.GetValueOrDefault(defaultConfig.AddNewFilesToProject), CreateOneFilePerAction = pocoConfig.CreateOneFilePerAction.GetValueOrDefault(defaultConfig.CreateOneFilePerAction), CreateOneFilePerEntity = pocoConfig.CreateOneFilePerEntity.GetValueOrDefault(defaultConfig.CreateOneFilePerEntity), CreateOneFilePerOptionSet = pocoConfig.CreateOneFilePerOptionSet.GetValueOrDefault(defaultConfig.CreateOneFilePerOptionSet), EntitiesToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.EntitiesToSkip, defaultConfig.EntitiesToSkip), EntityAttributeSpecifiedNames = AddPipeThenCommaDelimitedMissingDefaultValues(pocoConfig.EntityAttributeSpecifiedNames, defaultConfig.EntityAttributeSpecifiedNames), GenerateAttributeNameConsts = pocoConfig.GenerateAttributeNameConsts.GetValueOrDefault(defaultConfig.GenerateAttributeNameConsts), GenerateAnonymousTypeConstructor = pocoConfig.GenerateAnonymousTypeConstructor.GetValueOrDefault(defaultConfig.GenerateAnonymousTypeConstructor), GenerateEnumProperties = pocoConfig.GenerateEnumProperties.GetValueOrDefault(defaultConfig.GenerateEnumProperties), InvalidCSharpNamePrefix = pocoConfig.InvalidCSharpNamePrefix ?? defaultConfig.InvalidCSharpNamePrefix, MakeReadonlyFieldsEditable = pocoConfig.MakeReadonlyFieldsEditable ?? defaultConfig.MakeReadonlyFieldsEditable, OptionSetsToSkip = AddPipeDelimitedMissingDefaultValues(pocoConfig.OptionSetsToSkip, defaultConfig.OptionSetsToSkip), PropertyEnumMappings = AddPipeDelimitedMissingDefaultValues(pocoConfig.PropertyEnumMappings, defaultConfig.PropertyEnumMappings), RemoveRuntimeVersionComment = pocoConfig.RemoveRuntimeVersionComment.GetValueOrDefault(defaultConfig.RemoveRuntimeVersionComment), UnmappedProperties = AddPipeThenCommaDelimitedMissingDefaultValues(pocoConfig.UnmappedProperties, defaultConfig.UnmappedProperties), UseTfsToCheckoutFiles = pocoConfig.UseTfsToCheckoutFiles.GetValueOrDefault(defaultConfig.UseTfsToCheckoutFiles), UseXrmClient = pocoConfig.UseXrmClient.GetValueOrDefault(defaultConfig.UseXrmClient) }; ExtensionArguments = AddMissingArguments(poco.ExtensionArguments, @default.ExtensionArguments); UserArguments = AddMissingArguments(poco.UserArguments, @default.UserArguments); Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); _filePath = filePath; }
/// <summary> /// Initializes a new instance of the <see cref="EarlyBoundGeneratorConfig"/> class. /// </summary> /// <param name="poco">The poco.</param> private EarlyBoundGeneratorConfig(POCO.Config poco) { var @default = GetDefault(); CrmSvcUtilRelativePath = poco.CrmSvcUtilRelativePath ?? @default.CrmSvcUtilRelativePath; RemoveObsoleteValues(poco, @default); AudibleCompletionNotification = poco.AudibleCompletionNotification ?? @default.AudibleCompletionNotification; IncludeCommandLine = poco.IncludeCommandLine ?? @default.IncludeCommandLine; MaskPassword = poco.MaskPassword ?? @default.MaskPassword; UpdateObsoleteSettings(poco, poco.ExtensionConfig, @default); ExtensionConfig = @default.ExtensionConfig; ExtensionConfig.SetPopulatedValues(poco.ExtensionConfig); ExtensionArguments = AddMissingArguments(poco.ExtensionArguments, @default.ExtensionArguments); UserArguments = AddMissingArguments(poco.UserArguments, @default.UserArguments); SettingsVersion = string.IsNullOrWhiteSpace(poco.Version) ? "0.0.0.0" : poco.Version; Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); }
private void RemoveObsoleteValues(POCO.Config poco, Config @default) { if (CrmSvcUtilRelativePath == @"CrmSvcUtil Ref\crmsvcutil.exe") { // 5.14.2015 XTB changed to use the Plugins Directory, but then MEF changed Paths to be realtive to Dll. CrmSvcUtilRelativePath = @default.CrmSvcUtilRelativePath; } foreach (var value in poco.ExtensionArguments.Where(a => string.Equals(a.Value, "DLaB.CrmSvcUtilExtensions.Entity.OverridePropertyNames,DLaB.CrmSvcUtilExtensions", StringComparison.InvariantCultureIgnoreCase)).ToList()) { // Pre 2.13.2016, this was the default value. Replaced with a single naming service that both Entities and OptionSets can use poco.ExtensionArguments.Remove(value); } // Pre 2.13.2016, this was the default value. Not Needed Anymore var old = "OpportunityProduct.OpportunityStateCode,opportunity_statuscode|" + "OpportunityProduct.PricingErrorCode,qooi_pricingerrorcode|" + "ResourceGroup.GroupTypeCode,constraintbasedgroup_grouptypecode"; if (string.Equals(poco.ExtensionConfig.PropertyEnumMappings, old, StringComparison.InvariantCultureIgnoreCase) || string.Equals(poco.ExtensionConfig.PropertyEnumMappings, old + "|", StringComparison.InvariantCultureIgnoreCase)) { poco.ExtensionConfig.PropertyEnumMappings = string.Empty; } }
private static void UpdateObsoleteSettings(POCO.Config poco, POCO.ExtensionConfig pocoConfig, EarlyBoundGeneratorConfig @default) { var pocoVersion = new Version(poco.Version); if (pocoVersion < new Version("1.2016.6.1")) { // Storing of UnmappedProperties and EntityAttributeSpecified Names switched from Key,Value1,Value2|Key,Value1,Value2 to Key:Value1,Value2|Key:Value1,Value2 // Also convert from a List to a HashSet pocoConfig.EntityAttributeSpecifiedNames = ConvertNonColonDelimitedDictionaryListToDictionaryHash(pocoConfig.EntityAttributeSpecifiedNames); pocoConfig.UnmappedProperties = ConvertNonColonDelimitedDictionaryListToDictionaryHash(pocoConfig.UnmappedProperties); } if (pocoVersion < new Version("1.2018.9.12")) { // Update the OptionSet codecustomization Argument Setting to use the new Generic Code Customization Service var oldValue = poco.ExtensionArguments.FirstOrDefault( a => a.SettingType == CreationType.OptionSets && a.Name == "codecustomization"); var newValue = @default.ExtensionArguments.FirstOrDefault( a => a.SettingType == CreationType.OptionSets && a.Name == "codecustomization"); if (oldValue != null && newValue != null) { poco.ExtensionArguments.Remove(oldValue); poco.ExtensionArguments.Add(newValue); } } if (pocoVersion < new Version("1.2020.3.23")) { // Added new option to overwrite Option Set properties. This is the desired default now, but don't break old generation settings. if (poco.ExtensionConfig.ReplaceOptionSetPropertiesWithEnum == null) { poco.ExtensionConfig.ReplaceOptionSetPropertiesWithEnum = false; } } if (pocoVersion < new Version("1.2020.10.1")) { // Issue #254 add invalid actions to blacklist. var invalidBlacklistItems = "RetrieveAppSettingList|RetrieveAppSetting|SaveAppSetting|msdyn_GetSIFeatureConfiguration".ToLower(); if (string.IsNullOrWhiteSpace(poco.ExtensionConfig.ActionsToSkip)) { poco.ExtensionConfig.ActionsToSkip = invalidBlacklistItems; } else { poco.ExtensionConfig.ActionsToSkip += "|" + invalidBlacklistItems; } } if (pocoVersion < new Version("1.2020.12.18")) { // 12.18.2020 introduced Valueless parameters, but GenerateActions existed before as a null, need a boolean value to determine if it should be included var generateActions = poco.UserArguments.FirstOrDefault(a => a.Name == UserArgumentNames.GenerateActions && a.Value == null); if (generateActions != null) { generateActions.Value = "true"; generateActions.Valueless = true; } } }