private string BuildNormalizedVector(bool addEmptyValues) { var param = new List <string> { $"AV:{AttackVector.StringValue()}", $"AC:{AttackComplexity.StringValue()}", $"PR:{PrivilegesRequired.StringValue()}", $"UI:{UserInteraction.StringValue()}", $"S:{Scope.StringValue()}", $"C:{ConfidentialityImpact.StringValue()}", $"I:{IntegrityImpact.StringValue()}", $"A:{AvailabilityImpact.StringValue()}" }; void AddConditional(string key, string value) { if (!string.IsNullOrEmpty(value)) { param.Add($"{key}:{value}"); } else if (addEmptyValues) { param.Add($"{key}:X"); } } AddConditional("E", ExploitCodeMaturity?.StringValue()); AddConditional("RL", RemediationLevel?.StringValue()); AddConditional("RC", ReportConfidence?.StringValue()); AddConditional("CR", ConfidentialityRequirement?.StringValue()); AddConditional("IR", IntegrityRequirement?.StringValue()); AddConditional("AR", AvailabilityRequirement?.StringValue()); AddConditional("MAV", ModifiedAttackVector?.StringValue()); AddConditional("MAC", ModifiedAttackComplexity?.StringValue()); AddConditional("MPR", ModifiedPrivilegesRequired?.StringValue()); AddConditional("MUI", ModifiedUserInteraction?.StringValue()); AddConditional("MS", ModifiedScope?.StringValue()); AddConditional("MC", ModifiedConfidentialityImpact?.StringValue()); AddConditional("MI", ModifiedIntegrityImpact?.StringValue()); AddConditional("MA", ModifiedAvailabilityImpact?.StringValue()); StringBuilder sb = new StringBuilder(); sb.Append(VectorPrefix); foreach (var current in param) { sb.Append('/'); sb.Append(current); } return(sb.ToString()); }