MCPcopy Create free account
hub / github.com/Tencent/xLua / getCreatorUsingGeneric

Method getCreatorUsingGeneric

Assets/XLua/Src/ObjectTranslator.cs:342–409  ·  view source on GitHub ↗
(DelegateBridgeBase bridge, Type delegateType, MethodInfo delegateMethod)

Source from the content-addressed store, hash-verified

340 = new Dictionary<Type, Func<DelegateBridgeBase, Delegate>>();
341
342 Func<DelegateBridgeBase, Delegate> getCreatorUsingGeneric(DelegateBridgeBase bridge, Type delegateType, MethodInfo delegateMethod)
343 {
344 Func<DelegateBridgeBase, Delegate> genericDelegateCreator = null;
345
346 if (genericAction == null)
347 {
348 var methods = typeof(DelegateBridge).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
349 genericAction = methods.Where(m => m.Name == "Action").OrderBy(m => m.GetParameters().Length).ToArray();
350 genericFunc = methods.Where(m => m.Name == "Func").OrderBy(m => m.GetParameters().Length).ToArray();
351 }
352 if (genericAction.Length != 5 || genericFunc.Length != 5)
353 {
354 return null;
355 }
356 var parameters = delegateMethod.GetParameters();
357#if !XLUA_GENERAL
358 if ((delegateMethod.ReturnType.IsValueType() && delegateMethod.ReturnType != typeof(void)) || parameters.Length > 4)
359 {
360 genericDelegateCreator = (x) => null;
361 }
362 else
363#endif
364 {
365 foreach (var pinfo in parameters)
366 {
367 if (pinfo.ParameterType.IsValueType() || pinfo.IsOut || pinfo.ParameterType.IsByRef)
368 {
369 genericDelegateCreator = (x) => null;
370 break;
371 }
372 }
373 if (genericDelegateCreator == null)
374 {
375 var typeArgs = parameters.Select(pinfo => pinfo.ParameterType);
376 MethodInfo genericMethodInfo = null;
377 if (delegateMethod.ReturnType == typeof(void))
378 {
379 genericMethodInfo = genericAction[parameters.Length];
380 }
381 else
382 {
383 genericMethodInfo = genericFunc[parameters.Length];
384 typeArgs = typeArgs.Concat(new Type[] { delegateMethod.ReturnType });
385 }
386 if (genericMethodInfo.IsGenericMethodDefinition)
387 {
388 var methodInfo = genericMethodInfo.MakeGenericMethod(typeArgs.ToArray());
389 genericDelegateCreator = (o) =>
390#if !UNITY_WSA || UNITY_EDITOR
391 Delegate.CreateDelegate(delegateType, o, methodInfo);
392#else
393 methodInfo.CreateDelegate(delegateType, bridge);
394#endif
395 }
396 else
397 {
398 genericDelegateCreator = (o) =>
399#if !UNITY_WSA || UNITY_EDITOR

Callers

nothing calls this directly

Calls 3

GetParametersMethod · 0.80
IsValueTypeMethod · 0.80
MakeGenericMethodMethod · 0.80

Tested by

no test coverage detected