27.04.2010, 20:22 | #1 |
Участник
|
Как определить программно тип переменной-параметра
Доброго времени суток, уважаемые!
Возник вопрос (скорее теоретический - практически можно обойти, но не интересно). Исходные данные: 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 |
Участник
|
На сколько я себе это представляю, расширенный тип закреплен именно за переменной, а не за её значением.
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 |
Участник
|
Цитата:
По моему разумению - если типы 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 |
Участник
|
Воот! И вот это самое приведение не позволяет проследить "начальный" тип значения. Т.е. при каждом присваивании (а передача параметра вызывает копирование значения) значение будет безвозвратно принимать тип той перменной в которую его записывают.
P.S.: Ещё можно попробовать поиграться с типом AnyType. Возможно его поведение будет отличаться от стандартных типов? |
|
|
За это сообщение автора поблагодарили: Sergey Petrov (1). |
28.04.2010, 09:58 | #5 |
Участник
|
Во внутреннем представлении переменной хранится информация только о базовом типе (строка, целое, енум и т.д.).
По-этому, при присвоении переменный, имеющих один базовый тип никаких приведений не требуется (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 |
Участник
|
Всем огромное спасибо. Подтвердили мои сомнения - архитектура передачи по значению не позволяет определять EDT передаваемых данных.
__________________
MS Dynamics AX 2009 Kernel 5.0.1600.4110 Application 5.0.1500.6491 |
|
28.04.2010, 16:11 | #7 |
Участник
|
Цитата:
Цитата:
X++: void foo(InventQty _qty) { // ... } void bar() { this.foo( 0 ); // здесь передается аргумент типа int, а не real! какие уж там тонкие отличия EDT... } По-моему, если нужно передавать не просто значение параметра, но и некую дополнительную семантику, связанную с этим значением, то проще и надежнее это реализовать за счет дополнительного параметра-enum'а. |
|
28.04.2010, 19:42 | #8 |
Участник
|
Цитата:
Спасибо за ссылки. Учту.
__________________
MS Dynamics AX 2009 Kernel 5.0.1600.4110 Application 5.0.1500.6491 |
|
29.04.2010, 10:06 | #9 |
Участник
|
Цитата:
Сообщение от gl00mie
Более того, передаваться исходно могут вообще данные не того типа, какой вы ожидаете. Например:
X++: void foo(InventQty _qty) { // ... } void bar() { this.foo( 0 ); // здесь передается аргумент типа int, а не real! какие уж там тонкие отличия EDT... } В момент вызова функции 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 |
|