IForeNETRuntimeMethodBinding.ByRef

Синтаксис

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».

См. также:

IForeNETRuntimeMethodBinding