in different occasions especially while using the SysExtension or SysOperation frameworks I found myself writing again the same code and I wanted something more generic the get the current class name. I didn’t find any built in method so I decided to make this simple helper method:
public static ClassName getClassNameFromFuncName(str _funcName)
{
ClassName className;
#define.ObjectMethodSeparator('.')
#define.StaticMethodSeparator('::')
if (strContains(_funcName, #ObjectMethodSeparator))
className = any2str(conPeek(str2con(_funcName, #ObjectMethodSeparator), 1));
if (strContains(_funcName, #StaticMethodSeparator))
className = any2str(conPeek(str2con(_funcName, #StaticMethodSeparator), 1));
if (!className2Id(className))
throw(error(Error::wrongUseOfFunction(funcName())));
return className;
}
you can try it:
public static void main(Args _args)
{
str fullName = funcName();
str className = MYD_Functions::getClassNameFromFuncName(fullName);
info(className);
}
here is how I used it to make a constructor more generic and reusable in other SysExtension instances:
class EF_ExtFrameworkSample3bisFactory extends EF_ExtFrameworkSample3bisBaseClass
{
}
public static Object construct(str _className, str _mySetting = '')
{
EF_StringAtttibute attr;
Object baseCl;
ClassName factoryClassName;
ClassId factoryClassId;
ClassName baseClassName;
ClassId baseClassId;
factoryClassName = MYD_Functions::getClassNameFromFuncName(funcName());
factoryClassId = className2Id(factoryClassName);
baseClassId = SysDictClass::superClass(factoryClassId);
baseClassName = classId2Name(baseClassId);
attr = new EF_StringAtttibute(_className);
baseCl = SysExtensionAppClassFactory::getClassFromSysAttribute(baseClassName, attr);
if (!baseCl)
{
throw error(Error::wrongUseOfFunction(funcName()));
}
baseCl.initSetting(_mySetting);
return baseCl;
}