Страница 1 из 1

Atlantis и рефлексия

Добавлено: 18 авг 2015, 01:00
mwoland
Уважаемые знатоки, подскажите, пожалуйста, имеются ли в атлантисе средства для анализа структуры объекта?
(то что в шарпе реализовано в неймспейсе system.reflection)
Прежде всего, интересует получение списка имплементируемых интерфейсов. Во вторую очередь - обращение к списку свойств инстанса. Хоть что-нибудь из подобного есть?
Сейчас, чтобы понять имплементирует ли объект интерфейс приходится некрасиво извращаться:

Код: Выделить всё

  function Resolve(objToResolve: objRef; container: oIocContainer): boolean;
  {
    var testSetter: oLogServiceSet;
    _try
    {
      testSetter := oLogServiceSet(objToResolve);
      if testSetter != nullref
        testSetter.SetLogService(container.Resolve('oLogService'));
      result := true;
    }
    _except on ExObjIfcNoImpl : { result := false; }

  }

Re: Atlantis и рефлексия

Добавлено: 18 авг 2015, 03:06
Den
Что то подобное реализовано в инcтрументарии support в модуле "консоль управления",
где можно "ткнуться" в рес-файл какой-то, посмотреть объекты "живущие" в нем...и у конкретного объекта, можно посмотреть его составляющие. а так же реализуемые interface

[img]
https://cloud.mail.ru/public/FNVc/7zHtqmYqf
[/img]

Т.е. что то есть на эту тему ,видимо, в атлантисе, раз в саппорте сделали такой object-explorer

Re: Atlantis и рефлексия

Добавлено: 18 авг 2015, 13:00
LaaLaa
Может подойдет вот это набор функций

// создать список реализаций объектного инт-са ObjInterfaceName,
// имена которых начинаются с ImplementationNamePrefix
function LoadImplementationList(ObjInterfaceName, ImplementationNamePrefix: string): boolean;

// количество реализаций в списке
function GetImplementationCount: integer;

// получить имя реализации, лежащей в списке под номером I (нумерация от 0)
function GetImplementationName(I: integer): string;

// убить список реализаций
procedure UnLoadImplementationList;

Код: Выделить всё

procedure ScanImplementationList;
{
    if( LoadImplementationList('F_TxoApi::ObjTxoIdentPlugin', 'Txo_') )
    {
       var i       : word;
       var ifc     : ObjTxoIdentPlugin;
       var ifcName :string;

       StartNewVisual(vtDownVisual, vfScreenBottom + vfTimer + vfBreak + vfConfirm, 'Заполнение списка интерфейсов...', GetImplementationCount);

       for( i := 0; i < GetImplementationCount; i := i + 1 )
       {
           if( not NextVisual) break;

           ifcName := GetImplementationName(i);
           GetVipRef(ifc,ifcName);
           Message(ifc.GetInfo);
           FreeVipInterface(ifc);
       }
       StopVisual('',0)
    }

    // UnLoadImplementationList всегда вызвать после LoadImplementationList
    // не зависимо True было или False
    UnLoadImplementationList;
}