T RunMethod <S, T>(T defaultIfNotExisting, params object[] parameters) { if (container == null) { return(defaultIfNotExisting); } var methodName = typeof(S).Name.Replace("Harmony", ""); var method = PatchTools.GetPatchMethod <S>(container, methodName); if (method != null) { if (typeof(T).IsAssignableFrom(method.ReturnType)) { return((T)method.Invoke(null, Type.EmptyTypes)); } var input = (parameters ?? new object[0]).Union(new object[] { instance }).ToArray(); var actualParameters = AccessTools.ActualParameters(method, input); method.Invoke(null, actualParameters); return(defaultIfNotExisting); } return(defaultIfNotExisting); }
T RunMethod <S, T>(T defaultIfNotExisting, Func <T, string> failOnResult = null, params object[] parameters) { if (auxilaryMethods.TryGetValue(typeof(S), out var method)) { var input = (parameters ?? new object[0]).Union(new object[] { instance }).ToArray(); var actualParameters = AccessTools.ActualParameters(method, input); if (typeof(T).IsAssignableFrom(method.ReturnType)) { var result = (T)method.Invoke(null, actualParameters); if (failOnResult != null) { var error = failOnResult(result); if (error != null) { throw new Exception($"Method {method.FullDescription()} returned an unexpected result: {error}"); } } return(result); } else { throw new Exception($"Method {method.FullDescription()} has wrong return type (should be assignable to {typeof(T).FullName})"); } } return(defaultIfNotExisting); }
void RunMethod <S>(params object[] parameters) { if (auxilaryMethods.TryGetValue(typeof(S), out var method)) { var input = (parameters ?? new object[0]).Union(new object[] { instance }).ToArray(); var actualParameters = AccessTools.ActualParameters(method, input); _ = method.Invoke(null, actualParameters); } }
private void RunMethod<S>(params object[] parameters) { if (container == null) return; var methodName = typeof(S).Name.Replace("Harmony", ""); var method = GetPatchMethod<S>(container, methodName); if (method != null) { var input = (parameters ?? new object[0]).Union(new object[] { instance }).ToArray(); var actualParameters = AccessTools.ActualParameters(method, input); method.Invoke(null, actualParameters); } }
T RunMethod <S, T>(T defaultIfNotExisting, params object[] parameters) { if (auxilaryMethods.TryGetValue(typeof(S), out var method)) { var input = (parameters ?? new object[0]).Union(new object[] { instance }).ToArray(); var actualParameters = AccessTools.ActualParameters(method, input); if (typeof(T).IsAssignableFrom(method.ReturnType)) { return((T)method.Invoke(null, actualParameters)); } _ = method.Invoke(null, actualParameters); return(defaultIfNotExisting); } return(defaultIfNotExisting); }
void RunMethod <S>(ref Exception exception, params object[] parameters) { if (auxilaryMethods.TryGetValue(typeof(S), out var method)) { var input = (parameters ?? new object[0]).Union(new object[] { instance }).ToArray(); var actualParameters = AccessTools.ActualParameters(method, input); try { var result = method.Invoke(null, actualParameters); if (method.ReturnType == typeof(Exception)) { exception = result as Exception; } } catch (Exception ex) { ReportException(ex, method); } } }