AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.04.2012, 11:29   #1  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
.NET Generic
Доброго дня!

Товарищи, есть ситуация. Некая библиотека (.NET) возвращает типизированную коллекцию clr-объектов. Как к ней получить доступ из Х++?

Кто-нибудь сталкивался c такой задачей?
Работаю в 4ке.
Старый 23.04.2012, 11:54   #2  
jonny is offline
jonny
Участник
Аватар для jonny
Самостоятельные клиенты AX
 
217 / 124 (5) +++++
Регистрация: 10.02.2006
Адрес: СПб-Екб-?
А объекты в той же сборке?
Старый 23.04.2012, 11:58   #3  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
Да, в той же. Проблема в том, что я не могу получить Enumerator, чтобы перебрать результаты.
Старый 23.04.2012, 12:16   #4  
jonny is offline
jonny
Участник
Аватар для jonny
Самостоятельные клиенты AX
 
217 / 124 (5) +++++
Регистрация: 10.02.2006
Адрес: СПб-Екб-?
Не могу проблему понять...
Приведите код, быть может так понятнее станет
Старый 23.04.2012, 12:24   #5  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
Привожу кусок кода. Объявления переменных пропущены.

X++:
req = new Google.Analytics.AnalyticsRequest(settings);
query = new Google.GData.Analytics.DataQuery('ga:777777', startDate, endDate, 'ga:visits,ga:pageviews', 'ga:country', 'ga:country');
ds = req.Get(query);

iEnumerable = ds.get_Entries();
iEnumerator = iEnumerable.GetEnumerator(); // ТУТ ОШИБКА!!! 

// ClrInterop.ClrBridgeException: GetEnumerator is not a member of <get_Entries>d__0
Старый 23.04.2012, 13:40   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
через reflection
Старый 23.04.2012, 14:35   #7  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
да, пробую через reflection достучаться...
Старый 23.10.2013, 11:17   #8  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от AlexeyVS Посмотреть сообщение
да, пробую через reflection достучаться...
И как, получилось у Вас достучаться?
Старый 23.10.2013, 11:24   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
пример
За это сообщение автора поблагодарили: Logger (3), coolibin (3).
Старый 23.10.2013, 21:08   #10  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Благодарю, данный пример я видел. Там проиллюстрировано создание объекта, наполнение данными и вызов методов объекта через Refrection.

Но если я получаю данный объект (System.Collections.Generic.IEnumerable`1) как результат работы функции, которая содержится в объекте сборки, то не могу считать через Reflection её энумератор.
Старый 27.10.2013, 23:15   #11  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Но если я получаю данный объект (System.Collections.Generic.IEnumerable`1) как результат работы функции, которая содержится в объекте сборки, то не могу считать через Reflection её энумератор.
Можете:

X++:
    type = myIntList.GetType();

    propertyCount = type.GetProperty("Count");
    
    nil = new System.Object[0]();
    
    cnt = propertyCount.GetValue(myIntList, nil);
    
    info(strFmt("%1", cnt));
__________________
Axapta non erubescit
За это сообщение автора поблагодарили: Cardagant (1).
Старый 28.10.2013, 13:12   #12  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Спасибо за ответ! Но всё равно не выходит.

Попробую привести ситуацию подробнее

TMSoft.Gohub.Client.GohubConnection - Класс сборки, реализующий подключение к сторонней БД

TMSoft.Gohub.Client.GohubDocument - Класс сборки, реализующий объекты, коллекцию которых требуется получить.

X++:
System.Type                         enumerable;
System.Type                         enumerator;
System.Object                       CLRenumerable;
System.Object                       CLRenumerator;
System.Reflection.MethodInfo        methodInfo;
;

// Создаётся некоторое подключение
con = new TMSoft.Gohub.Client.GohubConnection(someparams);

// Получить коллекцию всех документов
// Описание функции говорит, что возвратит System.Collections.Generic.IEnumerable`1[TMSoft.Gohub.Client.GohubDocument]
CLRenumerable = con.QueryDocuments(0);

// Получить тип
enumerable = CLRenumerable.GetType();

info(enumerable.get_Name()); // <_QueryDocuments>d__0
info(enumerable.get_FullName()); // TMSoft.Gohub.Client.GohubConnection+<_QueryDocuments>d__0
info(enumerable.get_AssemblyQualifiedName()); // TMSoft.Gohub.Client.GohubConnection+<_QueryDocuments>d__0, TMSoft.Gohub.Client.Net, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

if (CLRInterop::isNull(enumerable)) // false
     throw error("null");

methodInfo = enumerable.GetMethod("GetEnumerator");

if (CLRInterop::isNull(methodInfo)) // true
     throw error("null"); 

CLRenumerator   = methodInfo1.Invoke(enumerable, nil);

Последний раз редактировалось Cardagant; 28.10.2013 в 13:18.
Старый 28.10.2013, 13:51   #13  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
Цитата:
Сообщение от Cardagant Посмотреть сообщение
X++:
CLRenumerator   = methodInfo1.Invoke(enumerable, nil);
Может все же
X++:
CLRenumerator   = methodInfo.Invoke(CLRenumerable, nil);
А CLRInterop::isNull ошибается порой, известная тема...
__________________
Axapta non erubescit

Последний раз редактировалось b_nosoff; 28.10.2013 в 15:16.
Старый 28.10.2013, 14:23   #14  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от b_nosoff Посмотреть сообщение
Может все же
X++:
CLRenumerator   = methodInfo1.Invoke(CLRenumerable, nil);
Моя ошибка, Вы правы!

Цитата:
Сообщение от b_nosoff Посмотреть сообщение
А CLRInterop::isNull ошибается порой, известная тема...
Закоментировал проверку на Нулл, получаю ошибку на строке
X++:
CLRenumerator   = methodInfo.Invoke(CLRenumerable, nil);
Объект не инициализирован.

Последний раз редактировалось Cardagant; 28.10.2013 в 14:25.
Старый 28.10.2013, 15:28   #15  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Объект не инициализирован.
Попробуйте так:
X++:
enumerable = System.Type::GetType("System.Collections.IEnumerable");
чисто в порядке эксперимента
__________________
Axapta non erubescit
Старый 28.10.2013, 17:24   #16  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Благодарю Вас, b_nosoff
Вы мне очень помогли.

Привожу код рабочего метода, в котором получаю XML-текст первого документа.
Мне нужен цикл, его, естественно, доделаю.

Очень благодарен всем, кто помог!

docum - это класс документа, определённый в сборке (TMSoft.Gohub.Client.GohubDocument)

X++:
con = new TMSoft.Gohub.Client.GohubConnection("localhost", 20295);

CLRenumerable = con.QueryDocuments(0);
// Получить тип
//enumerable = CLRenumerable.GetType();
enumerable = System.Type::GetType("System.Collections.IEnumerable");

if (CLRInterop::isNull(enumerable)) // false
     throw error("null");

methodInfo = enumerable.GetMethod("GetEnumerator");

/*if (CLRInterop::isNull(methodInfo)) // true
     throw error("null");*/

CLRenumerator   = methodInfo.Invoke(CLRenumerable, nil);

if (CLRInterop::isNull(CLRenumerator))
     throw error("null");

enumerator  = System.Type::GetType("System.Collections.IEnumerator");

methodInfo = enumerator.GetMethod("MoveNext");

// Переход к первому элементу
b = methodInfo.Invoke(CLRenumerator, nil);
// считывание текущего элемента
if (b)
{
       // Сичтываю свойство с текущим документом
       ParameterInfo = enumerator.GetProperty("Current");
       // Получение текущего элемента
       docum = ParameterInfo.GetValue(CLRenumerator, nil);
       // ПОлучение документа в формате XML
       info(docum.GetXmlText());
}

Последний раз редактировалось Cardagant; 28.10.2013 в 17:40.
За это сообщение автора поблагодарили: Logger (5), MazZzDaI (1).
Теги
.net, generic

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ssmantha: Debugging .NET code called from X++ code in AX 2012 Blog bot DAX Blogs 1 11.11.2011 15:50
emeadaxsupport: When browsing AX 2009 Role Centers, you get an error: An unexpected error has occurred on systems with .NET Framework v4.0 installed Blog bot DAX Blogs 1 28.07.2010 08:24
AX.NET: интеграция .NET-приложений с Аксаптой и (будущие) возможности облачных вычислений gl00mie DAX: Программирование 2 23.04.2010 00:47
jinx: Microsoft Dynamics AX und .NET - Erstellen eines Termins in Outlook Blog bot DAX auf Deutsch 0 03.11.2007 00:33
Inside Dynamics AX 4.0: Working with the .NET Business Connector Blog bot DAX Blogs 0 04.10.2007 05:15

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:24.