ByRef(Index: Integer): Boolean;
Index - индекс аргумента.
Свойство ByRef определяет каким аргументам в перегруженном методе при поиске должны соответствовать параметры, передаваемые по ссылке (параметры с модификаторам Var или Out).
Выполняемый метод в своей сигнатуре может содержать параметры, передаваемые по ссылке - параметры с модификатором Var или Out. Для корректного поиска такого метода необходимо используя данное свойство определить, какие аргументы соответствуют параметрам, передаваемым по ссылке. Для этого в свойстве ByRef для аргумента необходимо установить значение True.
По умолчанию для всех аргументов в данном свойстве установлено значение False. При этом будет осуществляться поиск .NET-метода, имеющего в своей сигнатуре параметры, передаваемые по значению.
Для аргументов, передаваемых по ссылке, в коллекции Types также должен быть указан тип.
Значения параметров, передаваемых по ссылке, будут доступны в коллекции аргументов после расчета метода.
Для выполнения примера предполагается наличие в репозитории .NET-сборки с идентификатором «TestAssm». В данной сборке реализован класс «TestClass». В данном классе имеется функция «TestFunc», имеющая два параметра, передаваемые по значению и два параметра, передаваемые по ссылке. Все параметры имеют тип Integer.
Sub UserProc;
Var
MB: IMetabase;
Run: IForeNETRuntime;
Asm, Asm1: IForeNETRuntimeAssembly;
Typ, Typ1: IForeNETRuntimeType;
Bin: IForeNETRuntimeMethodBinding;
TypMeth: IForeNETRuntimeMethod;
Arg: IForeNETRuntimeMethodArgs;
TypInst: IForeNETRuntimeObjectInstance;
Begin
MB := MetabaseClass.Active;
Run := ForeNETAssemblyClass.Runtime;
//Пользовательская сборка и тип
Asm := Run.Assembly(MB.ItemById("TestAssm").Bind As IForeNETAssembly);
Typ := Asm.Type("TestAssm.TestClass");
//Сборка mscorlib для получения типа параметров
Asm1 := Run.SystemAssembly("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969db8053d3322ac");
Typ1 := Asm1.Type("System.Int32");
//Экземпляр типа
TypInst := Typ.CreateInstance;
//Связь для поиска перегруженного метода
Bin := Run.CreateBinding(4);
Bin.Types.Item(0) := Typ1;
Bin.Types.Item(1) := Typ1;
Bin.Types.Item(2) := Typ1;
Bin.Types.Item(3) := Typ1;
//Указание аргументов, соответствующих параметрам по ссылке
Bin.ByRef(2) := True;
Bin.ByRef(3) := True;
//Получение метода
TypMeth := Typ.Method("TestFunc", Bin);
//Создание аргументов для выполнения метода
Arg := Run.CreateArgs(4);
//Установка значений
Arg.Value(0) := 1;
Arg.Value(1) := 2;
//Выполнение метода
TypMeth.Invoke(TypInst, Arg);
//Получение значений параметров, которые передаются по ссылке,
//и которые были рассчитаны при выполнении метода
Debug.WriteLine(Arg.Value(2));
Debug.WriteLine(Arg.Value(3));
End Sub UserProc;
При выполнении примера будет получен контекст сборки «TestAssm». Из этой сборки будет получен тип «TestClass» и создан экземпляр объекта данного типа. Для поиска перегруженного метода будет создана связь и указаны типы аргументов. При выполнении метода «TestFunc» результирующие значения будут помещены в параметры, передаваемые по ссылке. Данные значения будут доступны в коллекции аргументов «Arg».
См. также: