diff --git a/src/libraries/Common/src/Extensions/ProviderAliasUtilities/ProviderAliasUtilities.cs b/src/libraries/Common/src/Extensions/ProviderAliasUtilities/ProviderAliasUtilities.cs index 40e80be6447651..69e7687e62665f 100644 --- a/src/libraries/Common/src/Extensions/ProviderAliasUtilities/ProviderAliasUtilities.cs +++ b/src/libraries/Common/src/Extensions/ProviderAliasUtilities/ProviderAliasUtilities.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Collections.Generic; using System.Diagnostics; using System.Reflection; @@ -13,16 +14,19 @@ internal static class ProviderAliasUtilities internal static string GetAlias(Type providerType) { - foreach (CustomAttributeData attributeData in CustomAttributeData.GetCustomAttributes(providerType)) + IList attributes = CustomAttributeData.GetCustomAttributes(providerType); + + for (int i = 0; i < attributes.Count; i++) { - if (attributeData.AttributeType.FullName == AliasAttibuteTypeFullName) + CustomAttributeData attributeData = attributes[i]; + if (attributeData.AttributeType.FullName == AliasAttibuteTypeFullName && + attributeData.ConstructorArguments.Count > 0) { - foreach (CustomAttributeTypedArgument arg in attributeData.ConstructorArguments) - { - Debug.Assert(arg.ArgumentType == typeof(string)); + CustomAttributeTypedArgument arg = attributeData.ConstructorArguments[0]; + + Debug.Assert(arg.ArgumentType == typeof(string)); - return arg.Value?.ToString(); - } + return arg.Value?.ToString(); } } diff --git a/src/libraries/Microsoft.Extensions.Logging/src/LoggerFilterOptions.cs b/src/libraries/Microsoft.Extensions.Logging/src/LoggerFilterOptions.cs index 68066e0c5e272f..3c8165e4d23713 100644 --- a/src/libraries/Microsoft.Extensions.Logging/src/LoggerFilterOptions.cs +++ b/src/libraries/Microsoft.Extensions.Logging/src/LoggerFilterOptions.cs @@ -28,6 +28,9 @@ public LoggerFilterOptions() { } /// /// Gets the collection of used for filtering log messages. /// - public IList Rules { get; } = new List(); + public IList Rules => RulesInternal; + + // Concrete representation of the rule list + internal List RulesInternal { get; } = new List(); } } diff --git a/src/libraries/Microsoft.Extensions.Logging/src/LoggerRuleSelector.cs b/src/libraries/Microsoft.Extensions.Logging/src/LoggerRuleSelector.cs index c2876ed1b6e570..a24e9838d0b538 100644 --- a/src/libraries/Microsoft.Extensions.Logging/src/LoggerRuleSelector.cs +++ b/src/libraries/Microsoft.Extensions.Logging/src/LoggerRuleSelector.cs @@ -22,7 +22,7 @@ public static void Select(LoggerFilterOptions options, Type providerType, string string providerAlias = ProviderAliasUtilities.GetAlias(providerType); LoggerFilterRule current = null; - foreach (LoggerFilterRule rule in options.Rules) + foreach (LoggerFilterRule rule in options.RulesInternal) { if (IsBetter(rule, current, providerType.FullName, category) || (!string.IsNullOrEmpty(providerAlias) && IsBetter(rule, current, providerAlias, category)))