0

X++ 编辑器中是否有一个函数可以让您在实现后自动提取接口?

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

4

1 回答 1

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();
    }
}
于 2017-04-10T08:40:35.690 回答