AX2012 X++ 代码编辑器中的自动提取界面
Auto Extract Interface in AX2012 X++ Code Editor
X++ 编辑器中有没有实现后自动提取接口的功能?
同样Visual Studio中有这样一个功能,它通过为实现接口所需的所有方法提供方法存根来自动提取已实现的接口。
不,没有这样的功能。
但是你可以写一个。请参阅下面的示例代码。
并将 Action menu item
添加到 \Menus\SysContextMenu
.
或者您可以将方法添加到 \Classes\EditorScripts
public static void main(Args _args)
{
#macrolib.AOT
SysContextMenuAOT menuAot;
TreeNode tn;
DictClass dc;
DictMethod dm;
int i, j;
str dmName;
str intSrc, intParams;
TreeNode itnRoot, itnChild;
if (!SysContextMenu::startedFrom(_args))
{
throw error(Error::wrongUseOfFunction(funcName()));
}
menuAot = _args.parmObject();
tn = menuAot.getFirstNode();
dc = new DictClass(className2Id(tn.AOTname()));
if (!dc)
{
throw error(Error::wrongUseOfFunction(funcName()));
}
for (i = 1; i <= dc.objectMethodCnt(); i++)
{
dm = dc.objectMethodObject(i);
dmName = dm.name();
if (dm.isStatic()
|| dm.isDelegate()
|| dm.accessSpecifier() != AccessSpecifier::public
|| dm.name() == identifierStr(classDeclaration)
)
{
continue;
}
if (!itnRoot)
{
itnRoot = TreeNode::findNode(#ClassesPath).AOTadd("I" + dc.name());
itnRoot.AOTsave();
itnChild = itnRoot.AOTfirstChild();
itnChild.AOTsetSource(strFmt('public interface I%1\n{\n}', dc.name()));
}
itnChild = itnRoot.AOTadd(dm.name());
intParams = '';
for (j = 1; j <= dm.parameterCnt(); j++)
{
if (j > 1)
{
intParams+= ', ';
}
intParams+= strFmt('%1 %2', extendedTypeId2DisplayName(dm.parameterType(j), dm.parameterId(j)), dm.parameterName(j));
}
intSrc = strFmt('public %1 %2(%3)\n{\n}', extendedTypeId2DisplayName(dm.returnType(), dm.returnId()), dm.name(), intParams);
itnChild.AOTsetSource(intSrc);
}
if (itnRoot)
{
itnRoot.AOTcompile();
itnRoot.AOTrestore();
itnRoot.AOTnewWindow();
itnRoot.AOTedit();
}
}
X++ 编辑器中有没有实现后自动提取接口的功能?
同样Visual Studio中有这样一个功能,它通过为实现接口所需的所有方法提供方法存根来自动提取已实现的接口。
不,没有这样的功能。
但是你可以写一个。请参阅下面的示例代码。
并将 Action menu item
添加到 \Menus\SysContextMenu
.
或者您可以将方法添加到 \Classes\EditorScripts
public static void main(Args _args)
{
#macrolib.AOT
SysContextMenuAOT menuAot;
TreeNode tn;
DictClass dc;
DictMethod dm;
int i, j;
str dmName;
str intSrc, intParams;
TreeNode itnRoot, itnChild;
if (!SysContextMenu::startedFrom(_args))
{
throw error(Error::wrongUseOfFunction(funcName()));
}
menuAot = _args.parmObject();
tn = menuAot.getFirstNode();
dc = new DictClass(className2Id(tn.AOTname()));
if (!dc)
{
throw error(Error::wrongUseOfFunction(funcName()));
}
for (i = 1; i <= dc.objectMethodCnt(); i++)
{
dm = dc.objectMethodObject(i);
dmName = dm.name();
if (dm.isStatic()
|| dm.isDelegate()
|| dm.accessSpecifier() != AccessSpecifier::public
|| dm.name() == identifierStr(classDeclaration)
)
{
continue;
}
if (!itnRoot)
{
itnRoot = TreeNode::findNode(#ClassesPath).AOTadd("I" + dc.name());
itnRoot.AOTsave();
itnChild = itnRoot.AOTfirstChild();
itnChild.AOTsetSource(strFmt('public interface I%1\n{\n}', dc.name()));
}
itnChild = itnRoot.AOTadd(dm.name());
intParams = '';
for (j = 1; j <= dm.parameterCnt(); j++)
{
if (j > 1)
{
intParams+= ', ';
}
intParams+= strFmt('%1 %2', extendedTypeId2DisplayName(dm.parameterType(j), dm.parameterId(j)), dm.parameterName(j));
}
intSrc = strFmt('public %1 %2(%3)\n{\n}', extendedTypeId2DisplayName(dm.returnType(), dm.returnId()), dm.name(), intParams);
itnChild.AOTsetSource(intSrc);
}
if (itnRoot)
{
itnRoot.AOTcompile();
itnRoot.AOTrestore();
itnRoot.AOTnewWindow();
itnRoot.AOTedit();
}
}