Skip to content

Commit 1ee618a

Browse files
authored
Merge pull request #128 from MV10/issue_111
fixes #111 - case-insensitive method argument-matching
2 parents a6177b7 + 0095855 commit 1ee618a

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ static void CallConfigurationMethods(ILookup<string, Dictionary<string, IConfigu
327327
if (methodInfo != null)
328328
{
329329
var call = (from p in methodInfo.GetParameters().Skip(1)
330-
let directive = method.Value.FirstOrDefault(s => s.Key == p.Name)
330+
let directive = method.Value.FirstOrDefault(s => s.Key.Equals(p.Name, StringComparison.OrdinalIgnoreCase))
331331
select directive.Key == null ? p.DefaultValue : directive.Value.ConvertTo(p.ParameterType, declaredLevelSwitches)).ToList();
332332

333333
var parm = methodInfo.GetParameters().FirstOrDefault(i => i.ParameterType == typeof(IConfiguration));
@@ -342,10 +342,15 @@ static void CallConfigurationMethods(ILookup<string, Dictionary<string, IConfigu
342342

343343
internal static MethodInfo SelectConfigurationMethod(IEnumerable<MethodInfo> candidateMethods, string name, Dictionary<string, IConfigurationArgumentValue> suppliedArgumentValues)
344344
{
345+
// Per issue #111, it is safe to use case-insensitive matching on argument names. The CLR doesn't permit this type
346+
// of overloading, and the Microsoft.Extensions.Configuration keys are case-insensitive (case is preserved with some
347+
// config sources, but key-matching is case-insensitive and case-preservation does not appear to be guaranteed).
345348
return candidateMethods
346349
.Where(m => m.Name == name &&
347-
m.GetParameters().Skip(1).All(p => p.HasDefaultValue || suppliedArgumentValues.Any(s => s.Key == p.Name)))
348-
.OrderByDescending(m => m.GetParameters().Count(p => suppliedArgumentValues.Any(s => s.Key == p.Name)))
350+
m.GetParameters().Skip(1)
351+
.All(p => p.HasDefaultValue || suppliedArgumentValues.Any(s => s.Key.Equals(p.Name, StringComparison.OrdinalIgnoreCase))))
352+
.OrderByDescending(m =>
353+
m.GetParameters().Count(p => suppliedArgumentValues.Any(s => s.Key.Equals(p.Name, StringComparison.OrdinalIgnoreCase))))
349354
.FirstOrDefault();
350355
}
351356

test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,30 @@ public void SinkWithIntArrayArgument()
492492
Assert.Equal(1, DummyRollingFileSink.Emitted.Count);
493493
}
494494

495+
[Trait("Bugfix", "#111")]
496+
[Fact]
497+
public void CaseInsensitiveArgumentNameMatching()
498+
{
499+
var json = @"{
500+
""Serilog"": {
501+
""Using"": [""TestDummies""],
502+
""WriteTo"": [{
503+
""Name"": ""DummyRollingFile"",
504+
""Args"": {""PATHFORMAT"" : ""C:\\""}
505+
}]
506+
}
507+
}";
508+
509+
var log = ConfigFromJson(json)
510+
.CreateLogger();
511+
512+
DummyRollingFileSink.Emitted.Clear();
513+
514+
log.Write(Some.InformationEvent());
515+
516+
Assert.Equal(1, DummyRollingFileSink.Emitted.Count);
517+
}
518+
495519
[Trait("Bugfix", "#91")]
496520
[Fact]
497521
public void WriteToLoggerWithRestrictedToMinimumLevelIsSupported()

0 commit comments

Comments
 (0)