![]() |
#21 |
Участник
|
Инкрементная компиляция базового класса приводит к компиляции подклассов. А т.к. я пробовал компилировать подкласс отдельно, то результат по идее был бы тот же.
Сейчас никак не получается снова воспроизвести такую ошибку, все работает идеально. Что было вчера? Запара наверное...))
__________________
// no comments |
|
![]() |
#22 |
Участник
|
Поигрался со static, получается, если убрать данный признак или наоборот добавить, в классе будут присутствовать оба метода с одинаковым именем. Один - явно, другой - неявно. Неявный будет существовать до тех пор, пока не создать такой же явно, а затем удалить.
Соответственно, если был static description() и по какой-то причине сделали его виртуальным (не static), то hasStaticMethod() будет возвращать true до тех пор, пока вручную не создать снова static description() и затем вручную его удалить. Попробовал разные варианты клиент/сервер, во всех случаях вызов hasStaticMethod() ведет себя стабильно как описано выше. Однако при запуске кода аксапта ведет себя нестабильно. Запустив класс на клиенте через контекстно меню не существующий код отрабатывает даже при отладке в дебаггере, однако по F5 сам вылетает в дебаггер с ошибкой, запустив еще раз по F5 клиент аскапты не справился и рухнул. :-) Иногда аксапта падает просто при изменении свойства RunOn. Все это касается AX4. Остальные версии не пробовал.
__________________
// no comments |
|
![]() |
#23 |
Участник
|
Оказывается стандартный \Classes\SysDictClass\hasObjectMethod
неправильно работает для методов FormStringControl.Id() SysMethodInfo.getAttribute() SysDictMethod.getAttribute() DictMethod.getAttribute() так происходит из-за того, что используемый в нем метод dictMethod.compiledOk() некорректно работает для случаев когда метод не определен на классе, но наследуется от родительского класса, который является системным (для обычных классов все ок) Вот исправление X++: public boolean hasObjectMethod_MRC( IdentifierName methodName ) { SysDictMethod dictMethod = new SysDictMethod(UtilElementType::ClassInstanceMethod, this.id(), methodName); ClassId actualClassId; ; if (!dictMethod) { return false; } // JEV008634 "Tech_Автоматическое убирание Bold шрифта на формах", PKoz 16.08.2024 --> // данное изменение потребовалось потому что стандартный метод hasObjectMethod неверно работает для методов // FormStringControl.Id() // SysMethodInfo.getAttribute() // SysDictMethod.getAttribute() // DictMethod.getAttribute() // так происходит из-за того, что используемый в нем метод dictMethod.compiledOk() // некорреткно работает для случаев когда метод не определен на классе, но наследуется от родительского класса, // который является системным (для обычных классов все ок) // но работать будет медленнее из медленного вызова methodsActualClassId // поэтому результат лучше кешировать if (!dictMethod.compiledOk()) { actualClassId = this.methodsActualClassId(methodName); if (!actualClassId) { return false; } dictMethod = new SysDictMethod(UtilElementType::ClassInstanceMethod, actualClassId, methodName); } // JEV008634 "Tech_Автоматическое убирание Bold шрифта на формах", PKoz 16.08.2024 <-- if (!dictMethod.compiledOk()) { return false; } return true; } |
|
Теги |
formhasmethod, sysdictclass, метод, проверка |
|
|