InjectionInfo.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Reflection;
  3. using TargetMethodType = System.Reflection.MethodBase;
  4. namespace com.bbbirder.injection
  5. {
  6. public struct InjectionInfo
  7. {
  8. /// <summary>
  9. /// indicate the method to be injected
  10. /// </summary>
  11. public TargetMethodType InjectedMethod { get; private set; }
  12. //TODO : FixingDelegate?
  13. // use one of the following to fix target method
  14. public MethodInfo FixingMethod { get; private set; }
  15. public Delegate FixingDelegate { get; private set; }
  16. public Type DryInjectAssmemble { get; private set; }
  17. public string DryInjectMethodName { get; private set; }
  18. public MethodInfo DryInjectMethod { get; private set; }
  19. public Action<Delegate> OriginReceiver;
  20. internal Action onStartFix;
  21. public static InjectionInfo Create(TargetMethodType methodToReplace, MethodInfo methodToProvide, Action<Delegate> originMethodReceiver = null)
  22. {
  23. DebugHelper.IsNotNull(methodToReplace,"methodToReplace is null");
  24. DebugHelper.IsNotNull(methodToProvide,"methodToProvide is null");
  25. return new InjectionInfo()
  26. {
  27. InjectedMethod = methodToReplace,
  28. FixingMethod = methodToProvide,
  29. OriginReceiver = originMethodReceiver,
  30. };
  31. }
  32. public static InjectionInfo Create(TargetMethodType methodToReplace, Delegate methodToProvide, Action<Delegate> originMethodReceiver = null)
  33. {
  34. DebugHelper.IsNotNull(methodToReplace,"methodToReplace is null");
  35. DebugHelper.IsNotNull(methodToProvide,"methodToProvide is null");
  36. return new InjectionInfo()
  37. {
  38. InjectedMethod = methodToReplace,
  39. FixingDelegate = methodToProvide,
  40. OriginReceiver = originMethodReceiver,
  41. };
  42. }
  43. public static InjectionInfo Create<T>(T methodToReplace, T methodToProvide, Action<T> originMethodReceiver = null) where T : Delegate
  44. {
  45. DebugHelper.IsNotNull(methodToReplace, "methodToReplace is null");
  46. DebugHelper.IsNotNull(methodToProvide, "methodToProvide is null");
  47. return new InjectionInfo()
  48. {
  49. InjectedMethod = methodToReplace.Method,
  50. FixingDelegate = methodToProvide,
  51. OriginReceiver = f => originMethodReceiver?.Invoke((T)f),
  52. };
  53. }
  54. public static InjectionInfo Create(Type assembleName, string filedName, MethodInfo methodToProvide)
  55. {
  56. DebugHelper.IsNotNull(methodToProvide, "methodToProvide is null");
  57. return new InjectionInfo()
  58. {
  59. DryInjectAssmemble = assembleName,
  60. DryInjectMethodName = filedName,
  61. DryInjectMethod = methodToProvide
  62. };
  63. }
  64. public static InjectionInfo Create(Action onStartFix){
  65. return new InjectionInfo(){
  66. onStartFix = onStartFix,
  67. };
  68. }
  69. }
  70. }