Exemple #1
0
        protected virtual void Validate_4_ParameterLayout()
        {
            var requredParameterLayout = GetRequiredParameterLayout().ToList();
            var foundParameterLayout   = CustomMethod.GetParameters();
            var valid = requredParameterLayout.Count == foundParameterLayout.Length;

            for (var i = 0; (i < foundParameterLayout.Length) && valid; i++)
            {
                if (requredParameterLayout[i].ParameterType.IsByRef)
                {
                    if (foundParameterLayout[i].ParameterType.GetElementType() != requredParameterLayout[i].ParameterType.GetElementType())
                    {
                        valid = false;
                    }
                    if ((HookType != MethodHookType.RunAfter) && (foundParameterLayout[i].IsOut != requredParameterLayout[i].IsOut))
                    {
                        valid = false;
                    }
                }
                else if (foundParameterLayout[i].ParameterType != requredParameterLayout[i].ParameterType)
                {
                    if (!foundParameterLayout[i].ParameterType.IsValueType && !requredParameterLayout[i].ParameterType.IsValueType && requredParameterLayout[i].ParameterType.IsSubclassOf(foundParameterLayout[i].ParameterType))
                    {
                        //should be simple ptr stuff & fine to "convert". We can allow this
                    }
                    else
                    {
                        valid = false;
                    }
                }
            }
            if (!valid)
            {
                Func <IEnumerable <CustomParameterInfo>, String> toString = (f) =>
                {
                    return(f.Select(t => t == null ? "NULL" : ((t.IsOut ? "out " : (t.ParameterType.IsByRef ? "ref " : "")) + (t.ParameterType.IsByRef ? t.ParameterType.GetElementType() : t.ParameterType).FullName)).Aggregate((f1, f2) => f1 + ", " + f2));
                };
                throw new ArgumentException("Invalid parameter Layout for method [" + MethodReferenceToString(CustomMethod) + "]! Expected [" + toString(requredParameterLayout) + "], got [" + toString(foundParameterLayout.Select(el => (CustomParameterInfo)el)) + "].");
            }
        }