public bool TryInvokeMember(string name, object[] argsOrig, out object result, List <int> changedParameters, out string error) { error = null; if (IndexInStorage == 0 && name == "ОчиститьСсылку") { if (argsOrig[0] is AutoWrap temp) { ObjectsList.RemoveKey(temp.IndexInStorage); } result = null; return(true); } result = null; object[] args = GetArrayRealObjects(argsOrig); try { object obj; if (IsDynamic) { obj = DynamicInvoker.InvokeMember(Object, name, args); } else { var method = InformationOnTheTypes.FindMethod(Type, IsType, name, args); if (method == null) { if (name == "_as") { obj = NetObjectToNative.GetInterface(Object, args[0]); } else if (!ExtensionMethod.ExecuteExtensionMethod(this, name, args, out obj) && !ExecuteInterfaceMethodAsObject(name, args, out obj, ref error)) { error += " Не найден метод " + name; return(false); } } else { obj = method.ExecuteMethod(IsType ? null : Object, args); } } SetChangeInArgs(argsOrig, args, changedParameters); result = obj; } catch (Exception e) { error = GetExceptionString("методе", name, e); return(false); } // Так как параметры могут изменяться (OUT) и передаются по ссылке // нужно обратно обернуть параметры return(true); }
public static bool CallAsGenericFuncAll(BinaryReader br, BinaryWriter bw, out object result, bool writeResult) { result = null;; if (!GetAW(br, bw, out var autoWrap)) { return(false); } string methodName = br.ReadString(); var arguments = GetArrayParams(br); var Params = GetArrayParams(br); // Можно параметры передавать ввиде типов и строк var genericArguments = new Type[arguments.Length]; for (int i = 0; i < genericArguments.Length; i++) { genericArguments[i] = NetObjectToNative.FindTypeForCreateObject(arguments[i]); } result = null; var typesOfParameters = AllMethodsForName.GetTypesParameters(Params); var res = InformationOnTheTypes.FindGenericMethodsWithGenericArguments( autoWrap.Type, autoWrap.IsType, methodName, genericArguments, typesOfParameters); if (res == null) { SetError("Не найден дженерик метод " + methodName, bw); return(false); } try { var copyParams = new object[Params.Length]; Params.CopyTo(copyParams, 0); var obj = autoWrap.IsType ? null : autoWrap.Object; result = res.ExecuteMethod(obj, copyParams); var returnType = res.Method.ReturnType; if (result != null && returnType.GetTypeInfo().IsInterface) { result = new AutoWrap(result, returnType); } if (writeResult) { bw.Write(true); WorkWithVariant.WriteObject(AutoWrap.WrapObject(result), bw); WriteChangeParams(bw, copyParams, AutoWrap.GetChangeParams(Params, copyParams)); } } catch (Exception e) { SetError(AutoWrap.GetExceptionString($"Ошибка вызова Дженерик метода {methodName}", "", e), bw); return(false); } return(true); }