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)) + "]."); } }