0

Я хочу добавить метод динамически к компоненту в томе 2012 года, как я могу это сделать с помощью кода? Является ли это возможным?Добавить метод динамически в компоненте ax 2012

+0

Не уверен, что вы подразумеваете под «компонентом» или тем, что вы на самом деле пытаетесь выполнить, но просмотрели возможности обработки событий в AX 2012 (https://msdn.microsoft.com/en-us/ библиотека/gg839762.aspx)? –

+0

На самом деле компонент здесь относится к классу или таблице, форме или карте. Мне нужно добавить метод динамически, как public static str getTime() {ret "time"; } – user3226663

+0

Компонент здесь относится к классу или карте или таблице или форме в AOT, мне нужно проверить, существует ли метод с именем getTime(), как public static str getTime() {ret "3/3/2015";} существует в компонент, если он не найден, тогда создайте вышеуказанный метод в этом компоненте. например: у нас есть класс в AOT с именем ImageListAppl, мне нужно проверить, существует или нет метод с именем getTime(), если он не найден, тогда динамически создайте метод getTime() в этом классе. это то же самое для других компонентов, таких как таблицы, карты, формы. – user3226663

ответ

3

Вот работа, которую я написал, что показывает кучу разных способов делать то, что Вы желаете:

static void Job79(Args _args) 
{ 
    TreeNode  treeNode = TreeNode::findNode(@'\Classes\Activities'); 
    SysDictClass sysDictClass = new SysDictClass(treeNode.applObjectId()); 
    FormRun   formRun = new FormRun(new Args(formStr(AifAction))); 
    Form   form = new Form(formStr(AifAction)); 
    ClassBuild  classBuild; 
    SysDictTable sysDictTable = new SysDictTable(tableNum(AccountSumMap)); // Maps are treated like tables 
    SysDictMethod sysDictMethod; 
    int    i; 
    MemberFunction method; 
    str    methodSource = 'public static str getTime()\n{\n\treturn "3/3/2015";\n}'; 


    // Find if class has a method 
    if (sysDictClass.hasObjectMethod('delete')) 
    { 
     info("Found object method delete"); 
    } 

    if (sysDictClass.hasStaticMethod('main')) 
    { 
     info("Found static method main"); 
    } 

    // Find if form has a method 
    if (formHasMethod(formRun, 'init')) 
    { 
     info("Found form method 'init'"); 
    } 


    if (form.AOTfindChild('methods').AOTfindChild('refreshGrid') != null) 
    { 
     info("Found 'refreshGrid' method on AifAction"); 
    } 


    if (sysDictClass.hasStaticMethod('getTime') == false) 
    { 
     classBuild = new ClassBuild(sysDictClass.name()); 

     treeNode = classBuild.addMethod('getTime', methodSource); 

     if (classBuild.classNode().AOTcompile()) 
     { 
      classBuild.classNode().AOTsave(); 
      info("Added method getTime, compiled, and saved"); 
     } 
     else 
     { 
      info(strFmt("Unable to compile method 'getTime' with source code '%1', restoring class...", treeNode.AOTgetSource())); 
      // Delete the non-compiling method 
      if (treeNode) 
       treeNode.AOTdelete(); 

      classBuild.classNode().AOTsave(); 
     } 

    } 
    else 
    { 
     info("Method 'getTime' already exists"); 
    } 

    if (sysDictTable.isMap()) 
    { 
     if (sysDictTable.doesMethodExist('getTime') == false) 
     { 
      treeNode = sysDictTable.treeNode().AOTfindChild('methods').AOTadd('getTime'); 
      method = sysDictTable.treeNode().AOTfindChild('methods').AOTfindChild('getTime'); 
      method.AOTsave(); 
      method.AOTsetSource(methodSource, true); 
      method.AOTsave(); 


      if (sysDictTable.treeNode().AOTcompile()) 
      { 
       sysDictTable.treeNode().AOTsave(); 
       info(strFmt("Added 'getTime' to AccountSumMap")); 
      } 
      else 
      { 
       info(strFmt("Unable to compile method 'getTime' with source code '%1', restoring class...", treeNode.AOTgetSource())); 

       // Delete the non-compiling method 
       if (treeNode) 
        treeNode.AOTdelete(); 

       sysDictTable.treeNode().AOTsave(); 
      } 
     } 
    } 
} 
1
private void findOrCreateTimeStamp(
     SysVersionControlTmpItem    _item) 
{ 
    str        timeStamp; 
    UtilElements     utilElement; 
    SysDictClass     dictClass; 
    ClassBuild      classBuild; 
    SysVersionControlTmpItem  item   = _item; 
    str        methodName  = "csGetVersion"; 
    int        time   = timenow(); 
    TreeNode      treeNode  = TreeNode::findNode(item.ItemPath); 

    utilElement = treeNode.utilElement();    

    timeStamp = date2Str(
         today(), 
         321, 
         DateDay::Digits2, 
         DateSeparator::Slash, 
         DateMonth::Digits2, 
         DateSeparator::Slash, 
         DateYear::Digits4, 
         DateFlags::None); 

    timeStamp = timeStamp + "_"           + 
         num2str0(time div 3600, 2, 0, 0, 0) + "_"   + 
         num2Str0(time mod 3600 div 60, 2, 0, 0, 0) + "_" + 
         num2Str0(time mod 3600 mod 60, 2, 0, 0, 0); 

    if (utilElement.recordType == UtilElementType::Class) 
    { 
     dictClass = new SysDictClass(className2Id(utilElement.name)); 
     classBuild = new ClassBuild(utilElement.name, true); 

     if (dictClass.hasStaticMethod(methodName)) 
     { 
      //Override method here, since the method already exists in the component. 
      classBuild.overrideMethod(methodName, 
             @"public static str csGetVersion()" + 
             "{"         + 
              "return '" + timeStamp + "';" + 
             "}"); 
     } 
     else 
     { 
      //Make a new method here since it does'nt exist in the component. 
      classBuild.addMethod(methodName, 
             @"public static str csGetVersion()" + 
             "{"         + 
              "return '" + timeStamp + "';" + 
             "}"); 
     } 

     classBuild.classNode().AOTcompile();  
    } 
} 

Вышеописанный способ создается со ссылкой на предыдущий ответ и других специалистов. Он проверяет, существует ли метод сначала в классе. Если обнаружено, что он переопределяет, другой создает новый метод. Для других элементов, таких как таблицы, формы и карты, мы можем реализовать аналогичным образом.