AX2012 X ++代码编辑器中的自动提取接口

时间:2017-04-08 12:11:34

标签: dynamics-ax-2012 x++ dynamics-ax-2012-r3 morph-x

X ++编辑器中是否有一个函数可以让你在实现后自动解压缩接口?

同样,Visual Studio中有这样一个函数,它通过为实现接口所需的所有方法提供方法存根来自动解压缩已实现的接口。

1 个答案:

答案 0 :(得分:1)

不,没有这样的功能。

但你可以写一个。请参阅下面的示例代码 并将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();
    }
}