11using System ;
22using System . Collections ;
33using System . Collections . Generic ;
4- using System . Linq ;
5- using System . Text ;
6- using System . Threading . Tasks ;
7-
84
95namespace NLog . Extensions . Logging
106{
@@ -14,34 +10,66 @@ namespace NLog.Extensions.Logging
1410 /// </summary>
1511 internal class NLogMessageParameterList : IList < NLog . MessageTemplates . MessageTemplateParameter >
1612 {
17- private IReadOnlyList < KeyValuePair < string , object > > _parameterList ;
13+ private readonly IReadOnlyList < KeyValuePair < string , object > > _parameterList ;
1814
1915 public NLogMessageParameterList ( IReadOnlyList < KeyValuePair < string , object > > parameterList , bool includesOriginalMessage )
2016 {
21- var validParameterList = includesOriginalMessage ? null : new List < KeyValuePair < string , object > > ( ) ;
17+ if ( ! includesOriginalMessage || ! IsValidParameterList ( parameterList ) )
18+ {
19+ _parameterList = CreateValidParameterList ( parameterList ) ;
20+ }
21+ else
22+ {
23+ _parameterList = parameterList ;
24+ }
25+ }
26+
27+ /// <summary>
28+ /// Verify that the input parameterList contains non-empty key-values and the orignal-format-property at the end
29+ /// </summary>
30+ private bool IsValidParameterList ( IReadOnlyList < KeyValuePair < string , object > > parameterList )
31+ {
32+ int parameterCount = parameterList . Count - 1 ;
33+ for ( int i = 0 ; i <= parameterCount ; ++ i )
34+ {
35+ var paramPair = parameterList [ i ] ;
36+ if ( ! ValidParameterKey ( paramPair . Key , i == parameterCount ) )
37+ return false ;
38+ }
39+
40+ return true ;
41+ }
42+
43+ /// <summary>
44+ /// Extract all valid properties from the input parameterList, and return them in a newly allocated list
45+ /// </summary>
46+ private IReadOnlyList < KeyValuePair < string , object > > CreateValidParameterList ( IReadOnlyList < KeyValuePair < string , object > > parameterList )
47+ {
48+ var validParameterList = new List < KeyValuePair < string , object > > ( parameterList . Count + 1 ) ;
2249 for ( int i = 0 ; i < parameterList . Count ; ++ i )
2350 {
2451 var paramPair = parameterList [ i ] ;
25- bool isNonOriginalFormatName ;
26- if ( ! string . IsNullOrEmpty ( paramPair . Key ) && ( ( isNonOriginalFormatName = paramPair . Key != NLogLogger . OriginalFormatPropertyName ) || i == parameterList . Count - 1 ) )
27- {
28- if ( validParameterList != null && isNonOriginalFormatName )
29- {
30- validParameterList . Add ( paramPair ) ;
31- }
32- }
33- else
34- {
35- if ( validParameterList == null )
36- {
37- validParameterList = new List < KeyValuePair < string , object > > ( ) ;
38- for ( int j = 0 ; j < i ; ++ i )
39- validParameterList . Add ( parameterList [ j ] ) ;
40- }
41- }
52+ if ( ! ValidParameterKey ( paramPair . Key , false ) )
53+ continue ;
54+
55+ validParameterList . Add ( parameterList [ i ] ) ;
4256 }
43- validParameterList ? . Add ( new KeyValuePair < string , object > ( ) ) ;
44- _parameterList = validParameterList ?? parameterList ;
57+ validParameterList . Add ( new KeyValuePair < string , object > ( ) ) ; // Simulate NLogLogger.OriginalFormatPropertyName
58+ return validParameterList ;
59+ }
60+
61+ private bool ValidParameterKey ( string keyValue , bool lastKey )
62+ {
63+ if ( string . IsNullOrEmpty ( keyValue ) )
64+ return false ; // Non-empty string not allowed
65+
66+ if ( keyValue == NLogLogger . OriginalFormatPropertyName )
67+ return lastKey ; // Original format message, must be last parameter
68+
69+ if ( lastKey )
70+ return false ; // Original format message, must be last parameter
71+
72+ return true ;
4573 }
4674
4775 public NLog . MessageTemplates . MessageTemplateParameter this [ int index ]
@@ -94,12 +122,14 @@ public bool Contains(NLog.MessageTemplates.MessageTemplateParameter item)
94122
95123 public void CopyTo ( NLog . MessageTemplates . MessageTemplateParameter [ ] array , int arrayIndex )
96124 {
97- throw new NotSupportedException ( ) ;
125+ for ( int i = 0 ; i < Count ; ++ i )
126+ array [ i + arrayIndex ] = this [ i ] ;
98127 }
99128
100129 public IEnumerator < NLog . MessageTemplates . MessageTemplateParameter > GetEnumerator ( )
101130 {
102- return _parameterList . Take ( _parameterList . Count - 1 ) . Select ( p => new NLog . MessageTemplates . MessageTemplateParameter ( p . Key , p . Value , null ) ) . GetEnumerator ( ) ;
131+ for ( int i = 0 ; i < Count ; ++ i )
132+ yield return this [ i ] ;
103133 }
104134
105135 public int IndexOf ( NLog . MessageTemplates . MessageTemplateParameter item )
0 commit comments