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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.09.2006, 16:03   #1  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Как проверить существование метода у объекта
Как можно проверить, существует ли метод у вызывающего объекта
Пример:
PHP код:
{
     
Object caller element.args().caller();
     ;
     
//если у вызывающего объекта нет метода MyMethod, то будет ошибка
     
caller.MyMethod();

Возникает вопрос, как сделать проверку, чтобы вызывать метод только в том случае, если он есть у вызывающего объекта?
Старый 12.09.2006, 16:08   #2  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Если объект — форма, то вот так Global::formHasMethod(...) можно попробовать.
__________________
С уважением,
glibs®
Старый 12.09.2006, 16:15   #3  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
А если объект - класс, как в моем случае?
Старый 12.09.2006, 16:20   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
\Classes\SysDictClass\hasObjectMethod
\Classes\SysDictClass\hasStaticMethod
\Classes\SysDictClass\isMethodActual
\Classes\SysDictClass\methodsActualClassId
За это сообщение автора поблагодарили: Lucky13 (1).
Старый 12.09.2006, 16:24   #5  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Огромное спасибо, то что нужно
Старый 12.09.2006, 17:50   #6  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Единственное, что .... из обасти проектирования.. Вы пытаетесь дернуть метод объекта, который вы получили.... Другими словами, вы ожидаете от него реализации какого-то поведения, функции.... интерфейса....
Я бы создал интерфейс, в своем классе(классах) реализовывал бы этот интерфейс, а у caller бы проверял - реализует ли данный object нужный мне интерфейс.
Хотя, в общем то, не принципиально. Как говорится "те же яйца, вид в профиль", но с точки зрения архитектуры и расширяемости решения я бы выбрал этот вариант.
За это сообщение автора поблагодарили: ATimTim (1).
Старый 13.09.2006, 09:18   #7  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от Андре Посмотреть сообщение
Единственное, что .... из обасти проектирования.. Вы пытаетесь дернуть метод объекта, который вы получили.... Другими словами, вы ожидаете от него реализации какого-то поведения, функции.... интерфейса....
Я бы создал интерфейс, в своем классе(классах) реализовывал бы этот интерфейс, а у caller бы проверял - реализует ли данный object нужный мне интерфейс.
Хотя, в общем то, не принципиально. Как говорится "те же яйца, вид в профиль", но с точки зрения архитектуры и расширяемости решения я бы выбрал этот вариант.
Проблема в том, что caller может быть как классом так и формой, так что без проверки существования метода не обойтись. Или я не прав?

Кстати, как в Аксапте проверить реализует ли object некоторый интефейс или нет?
Старый 13.09.2006, 09:58   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
1. внимательно изучите SysDictClass
2. проверка сама по себе CodeSmell (правда Ax не для брезгливых)
Старый 13.09.2006, 10:16   #9  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Класс SysDictClass я смотрел. С этой точки зрения нет разницы между вызовом метода hasObjectMethod и, скажем, isImplementing. Просто я думал, что Андре имел в виду какой-то другой способ
Старый 02.03.2022, 17:09   #10  
dim-gin is offline
dim-gin
Участник
 
41 / 30 (2) +++
Регистрация: 15.04.2014
Адрес: СПб
Коллеги, разрешите пнуть труп этой ветки глупым вопросом?
Почему для классов, у которых есть нестатитический метод description, hasStaticMethod по нему возвращает разные значения при вызове на клиенте и на серверной стороне?

DAX 2009.

Последний раз редактировалось dim-gin; 02.03.2022 в 17:10. Причина: Указал версию приложения
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 02.03.2022, 18:00   #11  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от dim-gin Посмотреть сообщение
Коллеги, разрешите пнуть труп этой ветки глупым вопросом?
Почему для классов, у которых есть нестатитический метод description, hasStaticMethod по нему возвращает разные значения при вызове на клиенте и на серверной стороне?

DAX 2009.
А почему вы проверяете наличие НЕстатического метода через hasStaticMethod(), когда надо использовать hasObjectMethod()?
__________________
// no comments
За это сообщение автора поблагодарили: Pandasama (2).
Старый 02.03.2022, 18:21   #12  
dim-gin is offline
dim-gin
Участник
 
41 / 30 (2) +++
Регистрация: 15.04.2014
Адрес: СПб
Мне надо проверить, что у класса есть статический метод "description". Де-факто его нет. Но есть обычный метод с тем же названием "description". И в этом случае вызванный hasStaticMethod на клиенте возвращает true, а на серверной стороне - false. Вопрос: почему? Правильный код возврата, ессно, false.
Старый 02.03.2022, 19:07   #13  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Завтра попробую проверить на AX4, AX2012.
Если у вас несколько АОСов, возможно объект вашего класса не везде успел синхронизироваться и результат может показывать старую информацию. Возможно ваш description сначала был static, а потом это ключевое слово просто убрали?
__________________
// no comments
Старый 03.03.2022, 09:16   #14  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Причины не знаю, но такое разное поведение у hasStaticMethod, действительно, проявляется (точнее такое проявляется в системном классе DictMethod).

Помню на каком-то из стандартных классов, наследников RunBaseBatch почему-то description был сделан не статическим методом, а методом экземпляра.

В итоге при работе в пакете у меня не выводился заголовок. Поэкспериментировал с созданием и вызовом caption джобом на клиенте - работает, а такой же эксперимент на сервере выдавал в возврате caption пустую строку.

Для решения моей проблемы достаточно было просто перекрыть caption на этом классе, поэтому дальше копать не стал.
Старый 03.03.2022, 09:46   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
AX2009
Проверил. Воспроизвелось!
Статический метод после удаления или переименования не удаляется и продолжает существовать и даже вызываться (посредством рефлексии SysDictClass.СallStatic) и возвращать старое значение. Даже отладка работает и дебагер показывает код старого уже удалённого метода.

Возможно переиндексация файлов приложения или рестарт AOS это лечит, но я не проверял

Последний раз редактировалось S.Kuskov; 03.03.2022 в 09:49.
За это сообщение автора поблагодарили: dim-gin (1).
Старый 14.03.2022, 21:32   #16  
dim-gin is offline
dim-gin
Участник
 
41 / 30 (2) +++
Регистрация: 15.04.2014
Адрес: СПб
Простите, что пропал. Нет, класс старый (но не стандарт), не менялся тонну лет, рестартов всех AOS'ов после последнего изменения было много.
Старый 14.03.2022, 22:16   #17  
dim-gin is offline
dim-gin
Участник
 
41 / 30 (2) +++
Регистрация: 15.04.2014
Адрес: СПб
Погонял на тесте, подёргал службы: видимо, трабла была таки в кэшах.

Пересоздание индексных файлов, ессно, помогло, но в системе 24/7 это особо не попрактиковать.
Старый 15.03.2022, 12:59   #18  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
X++:
SysFlushAOD::doFlush();
Старый 17.03.2022, 10:15   #19  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Интересная вещь творится (в AX4).
Случай похожий, поэтому сюда пишу.
Вот есть метод в базовом классе, ничего не менял, не трогал. Да и код на другом слое просто не позволяет ничего сделать.
X++:
void parmRecId(RecId _recId = 0)
{
;
    recId = _recId;
}
Код конечно так себе, решил сначала в наследнике добавить измененный.
X++:
RecId parmRecId(RecId _recId = recId)
{
;
    recId = _recId;
    
    return recId;
}
Естественно, пишет ошибку из-за несоответствия возвращаемых типов. А тест-то уже написан, решил просто перед именем префикс из подчеркивания сделать. Сохранился, вроде все ОК. parmRecId - в базовом классе, _parmRecId - в наследнике. Проверяю, валится в стек-трейс, что класс-наследник содержит нескомпилированный код. По сути получается, что переименовав метод, я создал новый, а старый стал невидимым и тупо остался в классе.
Ситуация не из простых, когда код находится на слое VAR. У нас многие классы написаны другой компанией-внедренцем очень и очень небрежно, и мы с 2008 года поддерживаем этот legacy и по сей день исправляем баги.
Иногда приходится просто мириться с тем, что невозможно изменить сигнатуру метода. В более сложных случаях - создаем новые классы, старые помечаем как obsolete, аккуратно меняем все вызовы в системе и не трогаем более.
__________________
// no comments

Последний раз редактировалось dech; 17.03.2022 в 10:18.
Старый 17.03.2022, 11:39   #20  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
dech, а инкрементальная компиляция не помогает?
Теги
formhasmethod, sysdictclass, метод, проверка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка при вызове COM-метода koraman DAX: Программирование 8 23.10.2014 09:57
Проблема вызова метода доступа (Enum'ы!) Zoe DAX: Программирование 4 14.04.2008 23:48
Проверить существование значения Himan DAX: Программирование 8 20.11.2006 16:49
lookup не закрывается до завершения метода modified Morpheus DAX: Программирование 4 09.08.2006 16:43
Есть ли таблица соответствий ID -объекта - Имя объекта в Аксапта? coja DAX: Администрирование 5 26.04.2005 15:25
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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