Skip to content

Commit 433dfdf

Browse files
committed
refactor(MessageObjectPoolHelper): 提取对象池创建逻辑到独立方法
将重复的对象池创建逻辑提取到独立的GetPool方法中,提高代码复用性和可维护性
1 parent 9e369bc commit 433dfdf

File tree

1 file changed

+44
-21
lines changed

1 file changed

+44
-21
lines changed

GameFrameX.NetWork/MessageObjectPoolHelper.cs

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)