powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как получить имя класса и метода в котором происходит выполнение
16 сообщений из 16, страница 1 из 1
Как получить имя класса и метода в котором происходит выполнение
    #37300671
Denis S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как получить имя класса и метода в коде метода при его выполении?

Для лучшего понимания вопроса пример:

Class Functions [ Abstract ]
{

ClassMethod Function1() As %String
{
set a=<имя класса>_" "_<имя метода>
quit a
}
}

Хотелось бы чтобы функция Function1 возвращала строку "Functions Function1".
Есть такая возможность?
Подскажите.
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37300716
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis S. , про имя класса видел в документации вот такую фигню

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Class MyApp.MyClass Extends %RegisteredObject
{
Method MyMethod() [ CodeMode = objectgenerator ]
    {
        Do %code.WriteLine(" Write """ _ %class.Name _ """")
        Do %code.WriteLine(" Quit")
        Quit $$$OK
    }
}

Попробовал на своём классе

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/// test
Class tmp.tmp Extends %Persistent
{

/// Тест
ClassMethod getData() [ CodeMode = objectgenerator ]
{
	Do %code.WriteLine(" Write """ _ %class.Name _ """")
	Do %code.WriteLine(" Quit")
	Quit $$$OK
}

}

Работает.
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37300723
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во время выполнения есть метод %ClassName(1)
предложенный krvsa, будет доступен во время компиляции
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37300726
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А рядом и про метод со свойствами немного было... Т.ч. для тебя вот полный комплект

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
/// test
Class tmp.tmp Extends %Persistent
{

/// Тест
ClassMethod getData() [ CodeMode = objectgenerator ]
{
	Do %code.WriteLine(" Write !,""" _ %class.Name _ """")
	Do %code.WriteLine(" Write !,""" _ %method.Name _ """")
	Do %code.WriteLine(" Quit")
	Quit $$$OK
}

}
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37300738
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis S., еще
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Class Functions [ Abstract ] {

ClassMethod Function1() As %String [CodeMode=generator]{
 $$$GENERATE("  Q """_%class_" "_%method_""" ")
 Quit $$$OK
}

}
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37300746
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorпредложенный krvsa, будет доступен во время компиляции
Не совсем так... Доступно все всегда. Просто сам текст метода будет писаться во время компилляции класса и там будут эти значения.
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37300901
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaDAiMorпредложенный krvsa, будет доступен во время компиляции
Не совсем так... Доступно все всегда. Просто сам текст метода будет писаться во время компилляции класса и там будут эти значения.
я имел ввиду, что все варианты получения методы, будут доступны только во время компиляции, т.е. чтобы использовать эти значения нужно писать генератор кода метода, что не есть удобно
в обычном методе, можно получить только имя класса через %ClassName(1)
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37300969
LeonM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имя класса

typeid(*this).name()

?
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37301724
MaWr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor ,
%ClassName(1) будет, только если наследоваться от %RegisteredObject.

LeonM,
Если надо именно runtime определять, то можно придумать какой-нибудь извращенный метод, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Class User.Functions [ Abstract, ProcedureBlock ]
{
ClassMethod Function1() As %String
{
	s $EC=""
	s s=$st(- 1 )
	s s=$st(s,"PLACE")
	s a=$p($p(s,"^", 2 )," ")
	s a=$e($p(s,$s($p(s,"^")["+":"+", 1 :"^"), 1 ), 2 ,$l($p(s,"+", 1 )))_" "_$p(a,".", 1 ,$l(a,".")- 1 )
	q a
}
}

Код: plaintext
1.
2.
3.
4.
Class User.Fun1 Extends User.Functions [ ProcedureBlock ]
{

}

Код: plaintext
1.
2.
3.
4.
USER>w ##class(User.Functions).Function1()
Function1 User.Functions
USER>w ##class(User.Fun1).Function1()
Function1 User.Fun1

Но я не уверен, что мой пример будет работать в 100% случаях.
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37301782
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis S. ,

Вы не указали версию Caché, поэтому привожу код для 2011.1.RC1:

Include %occIO

Class del.c [Abstract]
{

ClassMethod test()
{
  w "Имя метода = ",$$$CurrentMethod,!
  w "имя класса = ",$classname(),!
  w "имя класса = ",$this,!
}
}

Результат:
Код: plaintext
1.
2.
3.
USER>d ##class(del.c).test()
Имя метода = test
имя класса = del.c
имя класса = del.c
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37301797
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitпривожу код для 2011.1.RC1
В сравнении с моим 2007 - небо и земля!
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37301851
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaservitпривожу код для 2011.1.RC1В сравнении с моим 2007 - небо и земля! Для предыдущих версий код ненамного сложнее, например для версии 5.0.х:

Class del.c [ Abstract, ProcedureBlock ]
{
ClassMethod test()
{
  w "Имя метода = ",##expression(""""_$get(%methodname)_""""),!
  w "Имя класса = ",##expression(""""_$get(%classname)_""""),!
}
}

Class del.d Extends (%RegisteredObject, del.c) [ ProcedureBlock ]
{
}

Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
USER>d ##class(del.c).test()
Имя метода = test
Имя класса = del.c
 
USER>d ##class(del.d).test()
Имя метода = test
Имя класса = del.d
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37301972
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про такой способ получения класса и метода не знал
а может еще есть способ получения имени последней метки в программе
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37302202
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor,

Что-то типа $STACK($STACK,"PLACE") ?
Только в тестовых запусках из терминала у меня плохо работает.
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37302450
MaWr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.DAiMor,

Что-то типа $STACK($STACK,"PLACE") ?
Только в тестовых запусках из терминала у меня плохо работает.
Работает хорошо. Не забывайте про s $EC=""
...
Рейтинг: 0 / 0
Как получить имя класса и метода в котором происходит выполнение
    #37302467
MaWr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servitkrvsaпропущено...
В сравнении с моим 2007 - небо и земля! Для предыдущих версий код ненамного сложнее, например для версии 5.0.х:

Class del.c [ Abstract, ProcedureBlock ]
{
ClassMethod test()
{
  w "Имя метода = ",##expression(""""_$get(%methodname)_""""),!
  w "Имя класса = ",##expression(""""_$get(%classname)_""""),!
}
}

Class del.d Extends (%RegisteredObject, del.c) [ ProcedureBlock ]
{
}

Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
USER>d ##class(del.c).test()
Имя метода = test
Имя класса = del.c
 
USER>d ##class(del.d).test()
Имя метода = test
Имя класса = del.d


Ваш метод, тоже design-time:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	;User.c. 1 
	;(C)InterSystems, generated for class User.c.  Do NOT edit.  06 / 09 / 2011   02 : 00 :27PM
	;;42DB2DEE622866B3;User.c
	Quit
	;
ztest() public { w "Имя метода = ","test",!
	 w "Имя класса = ","User.c",!
}

Мой - runtime, но может работать криво, если имя метода начинается с буквы "z".
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как получить имя класса и метода в котором происходит выполнение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]