@@ -31,14 +31,27 @@ protected override ReadOnlyCollection<Expression> VisitExpressionList(ReadOnlyCo
3131 return isChanged ? results . AsReadOnly ( ) : expressions ;
3232 }
3333
34+ protected override IReadOnlyList < Expression > VisitExpressionList ( IReadOnlyList < Expression > expressions )
35+ {
36+ bool isChanged = false ;
37+ var results = new Expression [ expressions . Count ] ;
38+ for ( int i = 0 , n = expressions . Count ; i < n ; i ++ ) {
39+ var expression = expressions [ i ] ;
40+ var p = Visit ( expression ) ;
41+ results [ i ] = p ;
42+ isChanged |= ! ReferenceEquals ( expression , p ) ;
43+ }
44+ return isChanged ? results : expressions ;
45+ }
46+
3447 /// <summary>
3548 /// Visits the element initializer expression.
3649 /// </summary>
3750 /// <param name="initializer">The initializer.</param>
3851 /// <returns>Visit result.</returns>
3952 protected virtual ElementInit VisitElementInitializer ( ElementInit initializer )
4053 {
41- ReadOnlyCollection < Expression > arguments = VisitExpressionList ( initializer . Arguments ) ;
54+ var arguments = VisitExpressionList ( ( IReadOnlyList < Expression > ) initializer . Arguments ) ;
4255 if ( arguments != initializer . Arguments ) {
4356 return Expression . ElementInit ( initializer . AddMethod , arguments ) ;
4457 }
@@ -63,6 +76,24 @@ protected virtual ReadOnlyCollection<ElementInit> VisitElementInitializerList(Re
6376 return isChanged ? results . AsReadOnly ( ) : original ;
6477 }
6578
79+ /// <summary>
80+ /// Visits the element initializer list.
81+ /// </summary>
82+ /// <param name="original">The original element initializer list.</param>
83+ /// <returns>Visit result.</returns>
84+ protected virtual IReadOnlyList < ElementInit > VisitElementInitializerList ( IReadOnlyList < ElementInit > original )
85+ {
86+ var results = new ElementInit [ original . Count ] ;
87+ bool isChanged = false ;
88+ for ( int i = 0 , n = original . Count ; i < n ; i ++ ) {
89+ var originalIntializer = original [ i ] ;
90+ ElementInit p = VisitElementInitializer ( originalIntializer ) ;
91+ results [ i ] = p ;
92+ isChanged |= ! ReferenceEquals ( originalIntializer , p ) ;
93+ }
94+ return isChanged ? results : original ;
95+ }
96+
6697 /// <inheritdoc/>
6798 protected override Expression VisitUnary ( UnaryExpression u )
6899 {
@@ -133,7 +164,7 @@ protected override Expression VisitMemberAccess(MemberExpression m)
133164 protected override Expression VisitMethodCall ( MethodCallExpression mc )
134165 {
135166 Expression instance = Visit ( mc . Object ) ;
136- IEnumerable < Expression > arguments = VisitExpressionList ( mc . Arguments ) ;
167+ IEnumerable < Expression > arguments = VisitExpressionList ( ( IReadOnlyList < Expression > ) mc . Arguments ) ;
137168 if ( ( instance == mc . Object ) && ( arguments == mc . Arguments ) )
138169 return mc ;
139170 return Expression . Call ( instance , mc . Method , arguments ) ;
@@ -164,7 +195,7 @@ protected override Expression VisitLambda(LambdaExpression l)
164195 /// <inheritdoc/>
165196 protected override Expression VisitNew ( NewExpression n )
166197 {
167- IEnumerable < Expression > arguments = VisitExpressionList ( n . Arguments ) ;
198+ IEnumerable < Expression > arguments = VisitExpressionList ( ( IReadOnlyList < Expression > ) n . Arguments ) ;
168199 if ( arguments == n . Arguments )
169200 return n ;
170201 if ( n . Members != null )
@@ -176,7 +207,7 @@ protected override Expression VisitNew(NewExpression n)
176207 protected override Expression VisitMemberInit ( MemberInitExpression mi )
177208 {
178209 var newExpression = ( NewExpression ) VisitNew ( mi . NewExpression ) ;
179- IEnumerable < MemberBinding > bindings = VisitBindingList ( mi . Bindings ) ;
210+ IEnumerable < MemberBinding > bindings = VisitBindingList ( ( IReadOnlyList < MemberBinding > ) mi . Bindings ) ;
180211 if ( ( newExpression == mi . NewExpression ) && ( bindings == mi . Bindings ) )
181212 return mi ;
182213 return Expression . MemberInit ( newExpression , bindings ) ;
@@ -186,7 +217,7 @@ protected override Expression VisitMemberInit(MemberInitExpression mi)
186217 protected override Expression VisitListInit ( ListInitExpression li )
187218 {
188219 var newExpression = ( NewExpression ) VisitNew ( li . NewExpression ) ;
189- IEnumerable < ElementInit > initializers = VisitElementInitializerList ( li . Initializers ) ;
220+ IEnumerable < ElementInit > initializers = VisitElementInitializerList ( ( IReadOnlyList < ElementInit > ) li . Initializers ) ;
190221 if ( ( newExpression == li . NewExpression ) && ( initializers == li . Initializers ) )
191222 return li ;
192223 return Expression . ListInit ( newExpression , initializers ) ;
@@ -195,7 +226,7 @@ protected override Expression VisitListInit(ListInitExpression li)
195226 /// <inheritdoc/>
196227 protected override Expression VisitNewArray ( NewArrayExpression na )
197228 {
198- IEnumerable < Expression > initializers = VisitExpressionList ( na . Expressions ) ;
229+ IEnumerable < Expression > initializers = VisitExpressionList ( ( IReadOnlyList < Expression > ) na . Expressions ) ;
199230 if ( initializers == na . Expressions )
200231 return na ;
201232 if ( na . NodeType == ExpressionType . NewArrayInit )
@@ -206,7 +237,7 @@ protected override Expression VisitNewArray(NewArrayExpression na)
206237 /// <inheritdoc/>
207238 protected override Expression VisitInvocation ( InvocationExpression i )
208239 {
209- IEnumerable < Expression > arguments = VisitExpressionList ( i . Arguments ) ;
240+ IEnumerable < Expression > arguments = VisitExpressionList ( ( IReadOnlyList < Expression > ) i . Arguments ) ;
210241 Expression expression = Visit ( i . Expression ) ;
211242 if ( ( arguments == i . Arguments ) && ( expression == i . Expression ) )
212243 return i ;
@@ -241,7 +272,7 @@ protected virtual MemberBinding VisitBinding(MemberBinding binding)
241272 /// <returns>Visit result.</returns>
242273 protected virtual MemberMemberBinding VisitMemberMemberBinding ( MemberMemberBinding binding )
243274 {
244- IEnumerable < MemberBinding > bindings = VisitBindingList ( binding . Bindings ) ;
275+ IEnumerable < MemberBinding > bindings = VisitBindingList ( ( IReadOnlyList < MemberBinding > ) binding . Bindings ) ;
245276 if ( bindings != binding . Bindings ) {
246277 return Expression . MemberBind ( binding . Member , bindings ) ;
247278 }
@@ -255,7 +286,7 @@ protected virtual MemberMemberBinding VisitMemberMemberBinding(MemberMemberBindi
255286 /// <returns>Visit result.</returns>
256287 protected virtual ReadOnlyCollection < MemberBinding > VisitBindingList ( ReadOnlyCollection < MemberBinding > original )
257288 {
258- var results = new List < MemberBinding > ( ) ;
289+ var results = new List < MemberBinding > ( original . Count ) ;
259290 bool isChanged = false ;
260291 for ( int i = 0 , n = original . Count ; i < n ; i ++ ) {
261292 var originalBinding = original [ i ] ;
@@ -266,9 +297,27 @@ protected virtual ReadOnlyCollection<MemberBinding> VisitBindingList(ReadOnlyCol
266297 return isChanged ? results . AsReadOnly ( ) : original ;
267298 }
268299
300+ /// <summary>
301+ /// Visits the binding list.
302+ /// </summary>
303+ /// <param name="original">The original binding list.</param>
304+ /// <returns>Visit result.</returns>
305+ protected virtual IReadOnlyList < MemberBinding > VisitBindingList ( IReadOnlyList < MemberBinding > original )
306+ {
307+ var results = new MemberBinding [ original . Count ] ;
308+ bool isChanged = false ;
309+ for ( int i = 0 , n = original . Count ; i < n ; i ++ ) {
310+ var originalBinding = original [ i ] ;
311+ MemberBinding p = VisitBinding ( originalBinding ) ;
312+ results [ i ] = p ;
313+ isChanged |= ! ReferenceEquals ( originalBinding , p ) ;
314+ }
315+ return isChanged ? results : original ;
316+ }
317+
269318 protected virtual MemberListBinding VisitMemberListBinding ( MemberListBinding binding )
270319 {
271- IEnumerable < ElementInit > initializers = VisitElementInitializerList ( binding . Initializers ) ;
320+ IEnumerable < ElementInit > initializers = VisitElementInitializerList ( ( IReadOnlyList < ElementInit > ) binding . Initializers ) ;
272321 if ( initializers != binding . Initializers )
273322 return Expression . ListBind ( binding . Member , initializers ) ;
274323 return binding ;
0 commit comments