internal static MethodBase GetOriginalMethod(this HarmonyMethod attr) { try { switch (attr.methodType) { case MethodType.Normal: if (attr.methodName is null) { return(null); } return(AccessTools.DeclaredMethod(attr.declaringType, attr.methodName, attr.argumentTypes)); case MethodType.Getter: if (attr.methodName is null) { return(null); } return(AccessTools.DeclaredProperty(attr.declaringType, attr.methodName).GetGetMethod(true)); case MethodType.Setter: if (attr.methodName is null) { return(null); } return(AccessTools.DeclaredProperty(attr.declaringType, attr.methodName).GetSetMethod(true)); case MethodType.Constructor: return(AccessTools.DeclaredConstructor(attr.declaringType, attr.argumentTypes)); case MethodType.StaticConstructor: return(AccessTools.GetDeclaredConstructors(attr.declaringType) .Where(c => c.IsStatic) .FirstOrDefault()); case MethodType.Enumerator: if (attr.methodName is null) { return(null); } var method = AccessTools.DeclaredMethod(attr.declaringType, attr.methodName, attr.argumentTypes); return(AccessTools.EnumeratorMoveNext(method)); } } catch (AmbiguousMatchException ex) { throw new HarmonyException($"Ambiguous match for HarmonyMethod[{attr.Description()}]", ex.InnerException ?? ex); } return(null); }