(DelegateBridgeBase bridge, Type delegateType, MethodInfo delegateMethod)
| 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 |
nothing calls this directly
no test coverage detected