Пример #1
0
        /// <summary>
        /// Replaces a method with another one
        /// </summary>
        /// <param name="sourceType">Original type</param>
        /// <param name="sourceMethod">Original method name</param>
        /// <param name="destinationType">New type</param>
        /// <param name="destinationMethod">New method name</param>
        void ReplaceMethod(Type sourceType, string sourceMethod, BindingFlags sourceBinding, Type destinationType, string destinationMethod, BindingFlags?destinationBinding = null, Type[] types = null)
        {
            ParameterInfo[] sourceParameters;
            ParameterInfo[] destinationParameters;
            MethodInfo      methodtoreplace = null;

            if (types == null)
            {
                methodtoreplace = sourceType.GetMethod(sourceMethod, sourceBinding);
            }
            else
            {
                methodtoreplace = sourceType.GetMethod(sourceMethod, types);
            }
            var methodtoinject = destinationType.GetMethod(destinationMethod, destinationBinding ?? sourceBinding);

            MyDebug.AssertRelease(methodtoreplace != null);
            if (methodtoreplace != null && methodtoinject != null)
            {
                sourceParameters      = methodtoreplace.GetParameters();
                destinationParameters = methodtoinject.GetParameters();
                MyDebug.AssertDebug(sourceParameters.Length == destinationParameters.Length);
                bool valid = true;

                // Verify signatures
                for (var x = 0; x < Math.Min(destinationParameters.Length, sourceParameters.Length); x++)
                {
                    MyDebug.AssertDebug(destinationParameters[x].ParameterType == sourceParameters[x].ParameterType);
                    if (destinationParameters[x].ParameterType != sourceParameters[x].ParameterType)
                    {
                        valid = false;
                    }
                }

                if (sourceParameters.Length != destinationParameters.Length || !valid)
                {
                    methodtoreplace = null;
                }
            }

            if (methodtoreplace != null && methodtoinject != null)
            {
                MethodUtil.ReplaceMethod(methodtoreplace, methodtoinject);
            }
            else
            {
                MySandboxGame.Log.WriteLineAndConsole(string.Format(Constants.ERROR_Reflection, sourceMethod));
            }
        }
Пример #2
0
        public static bool ReplaceMethod(MethodInfo methodtoreplace, MethodInfo methodtoinject, Type[] types = null)
        {
            ParameterInfo[] sourceParameters;
            ParameterInfo[] destinationParameters;

            MyDebug.AssertRelease(methodtoreplace != null);
            if (methodtoreplace != null && methodtoinject != null)
            {
                sourceParameters      = methodtoreplace.GetParameters();
                destinationParameters = methodtoinject.GetParameters();
                MyDebug.AssertDebug(sourceParameters.Length == destinationParameters.Length);
                bool valid = true;

                // Verify signatures
                for (var x = 0; x < Math.Min(destinationParameters.Length, sourceParameters.Length); x++)
                {
                    MyDebug.AssertDebug(destinationParameters[x].ParameterType == sourceParameters[x].ParameterType);
                    if (destinationParameters[x].ParameterType != sourceParameters[x].ParameterType)
                    {
                        valid = false;
                    }
                }

                if (sourceParameters.Length != destinationParameters.Length || !valid)
                {
                    methodtoreplace = null;
                }
            }

            if (methodtoreplace != null && methodtoinject != null)
            {
                MethodUtil.ReplaceMethod(methodtoreplace, methodtoinject);
                return(true);
            }
            else
            {
                return(false);
            }
        }