如何在代码中引用本地方法的name属性?

时间:2011-08-10 16:30:49

标签: intersystems-cache intersystems intersystems-ensemble

我有一个缓存对象属性,我想在上下文的名称中设置为当前的类和方法,以便对哪些方法/类生成这些对象的最大频率进行一些跟踪。

我可以使用下面的代码轻松获取当前类的名称,但我很难找到一种类似的方法来从文档中收集当前方法的名称。

set obj.ClassName  = ..%ClassName(1)  //Grab class name
set obj.MethodName =                  //Need to grab the method's name here

我知道当有问题的方法被设置为对象生成器时,这很容易实现,但我不想沿着这条路走下去。必须有一种简单的方法来引用方法的名称,对吧? / p>

///I'd rather not do this to my methods if I don't have to.
Method MyMethod() [ CodeMode = objectgenerator ]

3 个答案:

答案 0 :(得分:2)

有一个宏可以执行此操作:$$$ CurrentMethod,在%occIO.inc中定义,您可以在%SYS中找到它,因此您不需要包含来使用它。 $$$ CurrentClass也在那里定义。

答案 1 :(得分:1)

在方法中没有“官方”的方法。

您可以使用$stack($stack,"PLACE")表达式来确定当前执行的代码位置。它应该足以用于调试目的。如果确实需要,可以从中提取方法名称。我不建议在生产代码中使用它,但=)

答案 2 :(得分:1)

对于这样的事情,我喜欢使用%Projection类。您可以查看有关如何执行此操作的文档,但基本思想是,在编译一个类时,可以将其设置为生成另一个类。

如果你想扩展Intersystem给你的东西,比如知道你在用什么方法(Intersystem本身只是作弊和更改类编译器而不创建一个人人都可以使用的通用方法),你可以做某种黑客比如#CurrentMethod类参数并设置投影类,以便在保存时将其替换为实际的方法名称。

这很难设置,但是一旦你这样做,你可以根据需要添加任何其他元类功能。我这样做的目的与你提到的类似,并且用一些方便的方法生成强类型的结果集对象。

您也可以在从Cache Studio加载项调用的代码中执行相同的操作。例如,根据您编写加载项的方式,您可以从菜单项运行代码。