@@ -133,7 +133,7 @@ public static IMessageObject Get(Type type)
133133 }
134134
135135 // Get or create cached get action for this type / 获取或创建此类型的缓存获取操作
136- var getAction = GetActions . GetOrAdd ( type , t =>
136+ Func < object > ValueFactory ( Type t )
137137 {
138138 // Check if the type has a parameterless constructor / 检查类型是否有无参构造函数
139139 var constructor = t . GetConstructor ( Type . EmptyTypes ) ;
@@ -143,26 +143,56 @@ public static IMessageObject Get(Type type)
143143 }
144144
145145 // Get the pool for the specified type / 获取指定类型的池
146- var pool = ObjectPools . GetOrAdd ( t , _ =>
147- {
148- var policyType = typeof ( ResetObjectPolicy < > ) . MakeGenericType ( t ) ;
149- var policy = Activator . CreateInstance ( policyType ) ;
150- var createMethod = typeof ( ObjectPoolProvider ) . GetMethod ( nameof ( ObjectPoolProvider . Create ) ) !
151- . MakeGenericMethod ( t ) ;
152- return createMethod . Invoke ( PoolProvider , new [ ] { policy } ) ! ;
153- } ) ;
146+ var pool = GetPool ( t ) ;
154147
155148 // Create a cached delegate for the Get method / 为 Get 方法创建缓存的委托
156149 var poolType = typeof ( ObjectPool < > ) . MakeGenericType ( t ) ;
157150 var getMethod = poolType . GetMethod ( nameof ( ObjectPool < object > . Get ) ) ! ;
158-
151+
159152 return ( Func < object > ) ( ( ) => getMethod . Invoke ( pool , null ) ! ) ;
160- } ) ;
153+ }
154+
155+ var getAction = GetActions . GetOrAdd ( type , ValueFactory ) ;
161156
162157 // Use the cached delegate to get the object / 使用缓存的委托获取对象
163158 return ( IMessageObject ) getAction ( ) ;
164159 }
165160
161+ private static object GetPool ( Type type )
162+ {
163+ object ValueFactory ( Type _ )
164+ {
165+ var policyType = typeof ( ResetObjectPolicy < > ) . MakeGenericType ( type ) ;
166+ var policy = Activator . CreateInstance ( policyType ) ;
167+
168+ // Find the generic Create method / 查找泛型Create方法
169+ var createMethod = typeof ( ObjectPoolProvider ) . GetMethods ( )
170+ . FirstOrDefault ( m => m . Name == nameof ( ObjectPoolProvider . Create )
171+ && m . IsGenericMethodDefinition
172+ && m . GetParameters ( ) . Length == 1
173+ && m . GetParameters ( ) [ 0 ] . ParameterType . IsGenericType
174+ && m . GetParameters ( ) [ 0 ] . ParameterType . GetGenericTypeDefinition ( ) == typeof ( IPooledObjectPolicy < > ) ) ;
175+
176+ if ( createMethod == null )
177+ {
178+ throw new InvalidOperationException ( $ "Cannot find Create method on ObjectPoolProvider / 无法在 ObjectPoolProvider 上找到 Create 方法") ;
179+ }
180+
181+ var genericCreateMethod = createMethod . MakeGenericMethod ( type ) ;
182+ var result = genericCreateMethod . Invoke ( PoolProvider , new [ ] { policy } ) ;
183+
184+ if ( result == null )
185+ {
186+ throw new InvalidOperationException ( $ "Failed to create object pool for type { type . Name } / 无法为类型 { type . Name } 创建对象池") ;
187+ }
188+
189+ return result ;
190+ }
191+
192+ var pool = ObjectPools . GetOrAdd ( type , ValueFactory ) ;
193+ return pool ;
194+ }
195+
166196 /// <summary>
167197 /// Returns an object to the pool / 将对象返回到池中
168198 /// </summary>
@@ -191,7 +221,7 @@ public static void Return(IMessageObject obj)
191221 ArgumentNullException . ThrowIfNull ( obj , nameof ( obj ) ) ;
192222
193223 var objType = obj . GetType ( ) ;
194-
224+
195225 // Get or create cached return action for this type / 获取或创建此类型的缓存返回操作
196226 var returnAction = ReturnActions . GetOrAdd ( objType , type =>
197227 {
@@ -203,19 +233,12 @@ public static void Return(IMessageObject obj)
203233 }
204234
205235 // Get the pool for the object's actual type / 获取对象实际类型的池
206- var pool = ObjectPools . GetOrAdd ( type , _ =>
207- {
208- var policyType = typeof ( ResetObjectPolicy < > ) . MakeGenericType ( type ) ;
209- var policy = Activator . CreateInstance ( policyType ) ;
210- var createMethod = typeof ( ObjectPoolProvider ) . GetMethod ( nameof ( ObjectPoolProvider . Create ) ) !
211- . MakeGenericMethod ( type ) ;
212- return createMethod . Invoke ( PoolProvider , new [ ] { policy } ) ! ;
213- } ) ;
236+ var pool = GetPool ( type ) ;
214237
215238 // Create a cached delegate for the Return method / 为 Return 方法创建缓存的委托
216239 var poolType = typeof ( ObjectPool < > ) . MakeGenericType ( type ) ;
217240 var returnMethod = poolType . GetMethod ( nameof ( ObjectPool < object > . Return ) ) ! ;
218-
241+
219242 return ( Action < object > ) ( o => returnMethod . Invoke ( pool , new [ ] { o } ) ) ;
220243 } ) ;
221244
0 commit comments