@@ -1031,7 +1031,12 @@ private object InvokePropertyBagMember(string name, BindingFlags invokeFlags, ob
10311031
10321032 if ( name == SpecialMemberNames . NewEnum )
10331033 {
1034- return HostObject . Wrap ( TargetPropertyBag . GetEnumerator ( ) , typeof ( IEnumerator ) ) ;
1034+ return CreateEnumerator ( TargetPropertyBag ) ;
1035+ }
1036+
1037+ if ( name == SpecialMemberNames . NewAsyncEnum )
1038+ {
1039+ return CreateAsyncEnumerator ( TargetPropertyBag ) ;
10351040 }
10361041
10371042 if ( ! TargetPropertyBag . TryGetValue ( name , out value ) )
@@ -1079,7 +1084,12 @@ private object InvokePropertyBagMember(string name, BindingFlags invokeFlags, ob
10791084
10801085 if ( name == SpecialMemberNames . NewEnum )
10811086 {
1082- return HostObject . Wrap ( TargetPropertyBag . GetEnumerator ( ) , typeof ( IEnumerator ) ) ;
1087+ return CreateEnumerator ( TargetPropertyBag ) ;
1088+ }
1089+
1090+ if ( name == SpecialMemberNames . NewAsyncEnum )
1091+ {
1092+ return CreateAsyncEnumerator ( TargetPropertyBag ) ;
10831093 }
10841094
10851095 if ( args . Length < 1 )
@@ -1272,19 +1282,12 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
12721282
12731283 if ( name == SpecialMemberNames . NewEnum )
12741284 {
1275- if ( ( Target is HostObject ) || ( Target is IHostVariable ) || ( Target is IByRefArg ) )
1276- {
1277- if ( BindSpecialTarget ( out IEnumerable _ ) )
1278- {
1279- var enumerableHelpersHostItem = Wrap ( Engine , EnumerableHelpers . HostType , HostItemFlags . PrivateAccess ) ;
1280- if ( MiscHelpers . Try ( out var enumerator , ( ) => ( ( IDynamic ) enumerableHelpersHostItem ) . InvokeMethod ( "GetEnumerator" , this ) ) )
1281- {
1282- return enumerator ;
1283- }
1284- }
1285- }
1285+ return CreateEnumerator ( ) ;
1286+ }
12861287
1287- throw new NotSupportedException ( "The object is not enumerable" ) ;
1288+ if ( name == SpecialMemberNames . NewAsyncEnum )
1289+ {
1290+ return CreateAsyncEnumerator ( ) ;
12881291 }
12891292
12901293 if ( ( TargetDynamicMetaObject != null ) && TargetDynamicMetaObject . HasMember ( name , invokeFlags . HasFlag ( BindingFlags . IgnoreCase ) ) )
@@ -1381,19 +1384,12 @@ private object GetHostProperty(string name, BindingFlags invokeFlags, object[] a
13811384
13821385 if ( name == SpecialMemberNames . NewEnum )
13831386 {
1384- if ( ( Target is HostObject ) || ( Target is IHostVariable ) || ( Target is IByRefArg ) )
1385- {
1386- if ( BindSpecialTarget ( out IEnumerable _ ) )
1387- {
1388- var enumerableHelpersHostItem = Wrap ( Engine , EnumerableHelpers . HostType , HostItemFlags . PrivateAccess ) ;
1389- if ( MiscHelpers . Try ( out var enumerator , ( ) => ( ( IDynamic ) enumerableHelpersHostItem ) . InvokeMethod ( "GetEnumerator" , this ) ) )
1390- {
1391- return enumerator ;
1392- }
1393- }
1394- }
1387+ return CreateEnumerator ( ) ;
1388+ }
13951389
1396- throw new NotSupportedException ( "The object is not enumerable" ) ;
1390+ if ( name == SpecialMemberNames . NewAsyncEnum )
1391+ {
1392+ return CreateAsyncEnumerator ( ) ;
13971393 }
13981394
13991395 if ( ( TargetDynamicMetaObject != null ) && ( args . Length < 1 ) )
@@ -1693,6 +1689,28 @@ private object SetHostProperty(PropertyInfo property, BindingFlags invokeFlags,
16931689 throw new ArgumentException ( "Invalid property assignment" ) ;
16941690 }
16951691
1692+ private static object CreateEnumerator < T > ( IEnumerable < T > enumerable )
1693+ {
1694+ return HostObject . Wrap ( enumerable . GetEnumerator ( ) , typeof ( IEnumerator < T > ) ) ;
1695+ }
1696+
1697+ private object CreateEnumerator ( )
1698+ {
1699+ if ( ( Target is HostObject ) || ( Target is IHostVariable ) || ( Target is IByRefArg ) )
1700+ {
1701+ if ( BindSpecialTarget ( out IEnumerable _ ) )
1702+ {
1703+ var enumerableHelpersHostItem = Wrap ( Engine , EnumerableHelpers . HostType , HostItemFlags . PrivateAccess ) ;
1704+ if ( MiscHelpers . Try ( out var enumerator , ( ) => ( ( IDynamic ) enumerableHelpersHostItem ) . InvokeMethod ( "GetEnumerator" , this ) ) )
1705+ {
1706+ return enumerator ;
1707+ }
1708+ }
1709+ }
1710+
1711+ throw new NotSupportedException ( "The object is not enumerable" ) ;
1712+ }
1713+
16961714 #endregion
16971715
16981716 #endregion
0 commit comments