Exemple #1
0
        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);
        }