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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.04.2010, 20:22   #1  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Как определить программно тип переменной-параметра
Доброго времени суток, уважаемые!

Возник вопрос (скорее теоретический - практически можно обойти, но не интересно).

Исходные данные:
1. Есть EDT TypeA и EDT TypeB, наследованный от TypeA.
2. Есть класс, в котором есть метод, обрабатывающий по некоторому алгоритму значения типов TypeA и TypeB. Соответственно, тип передаваемого этому методу параметра указан как TypeA.

Вопрос. Как внутри этого метода определить, какого типа параметр ему передан (TypeA или TypeB)?

Заранее благодарен всем откликнувшимся.
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Старый 27.04.2010, 22:14   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
На сколько я себе это представляю, расширенный тип закреплен именно за переменной, а не за её значением.
X++:
Qty       source1;
InventQty source2;
Qty       target;
;
source1 = 100;
source2 = 200;
target = source1 + source2;
// Какого типа должно стать значение target? 
// А если типы source1 и source2 принадлежат не одной иерархии?

Объекты другое дело - здесь есть понятие не только типа переменной но и типа значения. Последнее можно определить при помощи функции ClassIdGet().

Последний раз редактировалось S.Kuskov; 27.04.2010 в 22:38.
Старый 28.04.2010, 09:06   #3  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
...
X++:
Qty       source1;
InventQty source2;
Qty       target;
;
source1 = 100;
source2 = 200;
target = source1 + source2;
// Какого типа должно стать значение target? 
// А если типы source1 и source2 принадлежат не одной иерархии?
...
Спасибо за проявленное внимание!
По моему разумению - если типы souce1 и source2 принадлежат разной иерархии, то начинает работать приведение типов. Но это - несколько иной случай.
Меня интересует, как определить программно (в коде Х++), какого типа переменная _source1 в момент исполнения кода следующего метода:
X++:
void method1(TypeA _source1)
{
...
    switch (/*определение типа переменной _source1*/)
    {
        case (extendedTypeNum(TypeA)) :
        ...
        break;
        case (extendedTypeNum(TypeB)) :
        ...
        break;
    }
...
}
Для полей таблиц, элементов форм и отчётов - я нашёл. А вот примера с переменной что-то нигде не видел. Может быть, подскажете, как быть в таком случае?
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Старый 28.04.2010, 09:26   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Sergey Petrov Посмотреть сообщение
приведение типов
Воот! И вот это самое приведение не позволяет проследить "начальный" тип значения. Т.е. при каждом присваивании (а передача параметра вызывает копирование значения) значение будет безвозвратно принимать тип той перменной в которую его записывают.

P.S.: Ещё можно попробовать поиграться с типом AnyType. Возможно его поведение будет отличаться от стандартных типов?
За это сообщение автора поблагодарили: Sergey Petrov (1).
Старый 28.04.2010, 09:58   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Во внутреннем представлении переменной хранится информация только о базовом типе (строка, целое, енум и т.д.).

По-этому, при присвоении переменный, имеющих один базовый тип никаких приведений не требуется (upd. единственно, для строк действует ограничение на длину - лишнее отбрасывается).
Это же касается и anytype. Единственное его отличие - до присвоения первого значения переменная не определена. После присвоения переменная получает тот тип, который был ей присвоен
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 28.04.2010 в 10:06.
За это сообщение автора поблагодарили: mazzy (2), S.Kuskov (1).
Старый 28.04.2010, 11:50   #6  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Всем огромное спасибо. Подтвердили мои сомнения - архитектура передачи по значению не позволяет определять EDT передаваемых данных.
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Старый 28.04.2010, 16:11   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
при присвоении переменный, имеющих один базовый тип никаких приведений не требуется (upd. единственно, для строк действует ограничение на длину - лишнее отбрасывается).
В свете перехода на CLR и от этого "обрезания" собираются отказаться.
Цитата:
Сообщение от Sergey Petrov Посмотреть сообщение
Всем огромное спасибо. Подтвердили мои сомнения - архитектура передачи по значению не позволяет определять EDT передаваемых данных.
Более того, передаваться исходно могут вообще данные не того типа, какой вы ожидаете. Например:
X++:
void foo(InventQty _qty)
{
    // ...
}
void bar()
{
    this.foo( 0 );  // здесь передается аргумент типа int, а не real! какие уж там тонкие отличия EDT...
}
При этом приведением типов Аксапта занимается лишь в момент, когда необходимо "вычислить" значение какого-либо выражения с использованием переданного аргумента. Это обсуждалось в теме axaptapedia: Trap typecast.
По-моему, если нужно передавать не просто значение параметра, но и некую дополнительную семантику, связанную с этим значением, то проще и надежнее это реализовать за счет дополнительного параметра-enum'а.
Старый 28.04.2010, 19:42   #8  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Цитата:
Сообщение от gl00mie Посмотреть сообщение
По-моему, если нужно передавать не просто значение параметра, но и некую дополнительную семантику, связанную с этим значением, то проще и надежнее это реализовать за счет дополнительного параметра-enum'а.
Я изначально так и предполагал сделать. В результате, после обсуждения, не обнаружив более красивого решения, так и сделал.
Спасибо за ссылки. Учту.
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Старый 29.04.2010, 10:06   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Более того, передаваться исходно могут вообще данные не того типа, какой вы ожидаете. Например:
X++:
void foo(InventQty _qty)
{
    // ...
}
void bar()
{
    this.foo( 0 );  // здесь передается аргумент типа int, а не real! какие уж там тонкие отличия EDT...
}
При этом приведением типов Аксапта занимается лишь в момент, когда необходимо "вычислить" значение какого-либо выражения с использованием переданного аргумента. Это обсуждалось в теме axaptapedia: Trap typecast.
Вот это совсем не понял.
В момент вызова функции foo() происходит преобразование из int в real и в параметре _qty хранится число в формате плавающей точки

По ссылке, на мой взгляд, показан пример некорректного приведения типов int64->boolean (точнее int64->Enum. Хотя, для boolean выполняется дополнительное преобразование).
Причем, при возврате из функции значения целочисленного типа, в том числе и литерала, приведение идет не к типу Boolean (Enum с Id=0xF000), а к некоему промежуточному енуму с Id = 0x0000 значения которого находятся в диапазоне 0..255.
X++:
Int   i;
boolean test()
{
    return 0x10000000;
}
;
i = test();
info( strfmt('%1', i) );
__________________
Axapta v.3.0 sp5 kr2
Теги
edt, параметры, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно ли программно определить, какая форма активная? Dima_Dima DAX: Программирование 17 19.09.2014 08:55
Как программно определить поля с выбранными галками (печать под итогов)? miaa DAX: Программирование 1 15.09.2006 10:00
Тип проекта if_maks DAX: Программирование 0 20.08.2004 14:30
Никак не могу вьехать, для чего нужны тип счета и тип разноски maloy DAX: Функционал 5 28.03.2004 17:18
Как определить тип Exception DenisS DAX: Программирование 0 25.12.2003 16:53

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

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

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