Partekatu bidez


X++ atributu-klaseak

Oharra

Komunitatearen interes taldeak Yammer-etik Microsoft Viva Engage-ra mugitu dira. Viva Engage komunitate batean sartzeko eta azken eztabaidetan parte hartzeko, bete Eskatu Finantza eta Eragiketak Viva Engage komunitatearen sarbidea inprimakia eta aukeratu sartu nahi duzun komunitatean.

Artikulu honetan X++-en atributuen erabilera azaltzen da.

Atributu bat klase ez-abstraktua da, SysAttribute klasea hedatzen duena (heredatzen duena). Atributuek motei eta metodoei buruzko metadatuak adierazten edo gordetzen dituzte. Atributu bat klase bati, klase-eremu bati, klase-metodo bati, interfaze bati edo taula bati erantsi daiteke.

Atributuak delegatuen eta metodoen kudeatzaileei aplikatzen zaizkie, kudeatzaileak helburu horietara mapatzeko.

Atributu-klase bat sortzea

Atributu klase batek SysAttribute klasea zuzenean luza dezake, edo SysAttribute klasearen edozein ondorengo luza dezake. SysAttribute klasea ezin da atributu gisa erabili, abstraktua delako. Ondorengo adibidean sor dezakezun atributu-klase arrunt baten deklarazioa eta diseinua erakusten dira.

public class PracticeAttribute extends SysAttribute
{
    // Fields in the classDeclaration.
    StartEnd startEndEnum;
    str reason;
    // Constructor.
    public void new(StartEnd _startEndEnum, str _reason)
    {
        startEndEnum  = _startEndEnum;
        reason = _reason;
    }
    // Other methods can go here.
}

Klase bat atributu batekin apaintzea

Ondorengo adibidean klase bat eta metodo bat erakusten dira, aurreko adibidean emandako PracticeAttribute-rekin apainduta. Atributuaren eraikitzaileak parametrorik hartzen ez badu, parametroen parentesiak aukerakoak dira. Atributuen dekorazioa parentesirik gabe egon [AnotherAttribute] daiteke.

[PracticeAttribute(StartEnd::End, "Use the RegularClass class at the end.")]
public class RegularClass
{
    [PracticeAttribute(Startend::Start, "Use the rehearse method at the start.")]
    public int rehearse()
    {
        // Logic goes here.
    }
    // More fields and methods belong here.
}

Atributu-izenaren atzizkia alde batera utz dezakezu, atzizkia hau bada.Attribute Adibidez, aurreko adibidean erabil [Practice][PracticeAttribute] dezakezu.

Atributuen eraikitzaileak

Zure atributu-klaseak pertsonalizatutako metadatuak gordetzeko gaitu dezakezu klase bat apaintzeko erabiltzen den bakoitzean, haren eraikitzaileak parametroak hartuz. Eraikitzailearen parametroek mota primitiboen literalak izan behar dute, adibidez, int,enum edo str. Konpilatzaileak ez du atributu-klasearen instantziarik eraikitzen. Atributu-klasearen izena gordetzen du, baita bere eraikitzailearen balio literalak ere. Beraz, atributu-eraikitzaile bateko logikak salbuespen bat botako balu, salbuespena ez litzateke aurkituko klase bat atributuarekin apainduz. Salbuespena geroago aurkituko litzateke prozesu batek klase bati begiratzen dionean, apainduta dagoen atributua ikusteko. Orduan sortzen da atributua.

Izendatzeko konbentzioak

Atributu-klase guztiek Atributu atzizkia dute izenean. Atributuen atzizkia gomendatzen dugun izen konbentzioa da, baina ez da sistemaren baldintza. Klase bat SysAttribute-tik zuzenean hedatzen den ala ez zehaztu dezakezu, aukeratu klasea Aplikazioen arakatzailean eta berrikusi Propietateak leihoko Extends propietatea.

SysObsoleteAttribute

Sistemak hainbat atributu eskaintzen ditu, SysObsoleteAttribute klasea barne. SysObsoleteAttribute klasearen erabilera bat konpilatzaileari jakinaraztea da konpilazioak huts egin beharko duela iturburu-kodean metodo jakin bat deitzen bada. Konpilatzaileak konpilazioa baztertzen du, eta atributuaren erabilera horretan gordetzen den mezu espezifikoa bistaratzen du. SysObsoleteAttribute klasea ere erabil daiteke konpilatzaileari erroreen ordez abisu mezuak igorri ditzala jakinarazteko.

SysObsoleteAttribute kodearen adibidea

[SysObsoleteAttribute("The Automobile class might have faster performance.", false)]
class Bicycle
{
    // Members of the Bicycle class go here.
}

Metadatuen isla

Isla erabiltzen duzu klase bati erantsitako atributuen metadatuak aurkitzeko. Atributuen isla egiteko erabili beharreko klaseak honako hauek dira:

  • DictClass klasea - Klaseetarako eta interfazeetarako.
  • DictMethod klasea: klase, interfaze edo tauletako metodoetarako.

Aurreko hausnarketa klaseetan, atributuen metadatuei buruzko hausnarketa egiteko metodoak honako hauek dira:

  • getAllAttributes metodoa
  • getAttribute metodoa
  • getAttributedClasses metodoa
  • getAttributes metodoa

Oharra

Ez mekanismorik X++ kodearen atributu jakin batekin apaindutako metodo edo klase guztiak zerrendatzeko. Hala ere, X++ konpilatzaileak informazio hori erreferentzia gurutzatuen datu-basean erregistratzen duenez, informazioa hortik atera daiteke.

Metadatuen isla kodearen adibidea

DictMethod klasea erabiltzen duzu metodo baten apaindura den atributu baten metadatuen balioa aurkitzeko. Ondorengo kode-adibideak SysEntryPointAttribute klasea erabiltzen du atributu gisa. Metodoaren izenaren eta metodoa duen klasearen izenaren parametroen balioak onartzen ditu. parmChecked metodoa SysEntryPointAttribute klasearen berezia da, eta ez da SysAttribute oinarrizko klasetik heredatu. Atributu-klase bakoitzak bere metodo-izena izan dezake bere metadatuetarako.

static public int MetadataOfSysEntryPointAttributeOnMethod
        (
        str _sNameOfClass,
        str _sNameOfMethod
        )
{
    // Return Values:
    // 0 == Has the attribute, its metadata value is false;
    // 1 == Has the attribute, its metadata value is true;
    // 2 == The method lacks the SysEntryPointAttribute.
    int nReturnValue = -1,
        nClassId;
    boolean boolParmChecked;
    DictMethod dm;
    Object attributeAsObject;
    SysEntryPointAttribute sepAttribute;
    Global::info("Starting AttributeReflection" 
        + " ::MetadataOfSysEntryPointAttributeOnMethod ....");
    Global::info(strFmt
        ("Parameters are: _sNameOfClass = %1 ,  _sNameOfMethod = %2 .", 
        _sNameOfClass, _sNameOfMethod)
        );
    nClassId = Global::className2Id(_sNameOfClass);
    dm = new DictMethod
        (UtilElementType::ClassInstanceMethod,
        nClassId,
        _sNameOfMethod
        );
    attributeAsObject = dm.getAttribute("SysEntryPointAttribute");
    if (attributeAsObject is SysEntryPointAttribute)
    {
        sepAttribute = attributeAsObject as SysEntryPointAttribute;
        boolParmChecked = sepAttribute.parmChecked();
        if (boolParmChecked)
            nReturnValue = 1;
        else
            nReturnValue = 0;
        Global::info(
            strFmt("Return value is %1.",
                nReturnValue)
            );
    }
    else
    {
        nReturnValue = 2;
        Global::error("Object is not a SysEntryPointAttribute??");
    }
    return nReturnValue;
}
/*** Output displayed in the Infolog.
Message (05:03:22 pm)
Starting AttributeReflection ::MetadataOfSysEntryPointAttributeOnMethod ....
Parameters are: _sNameOfClass = CustCustomerService ,  _sNameOfMethod = create .
Return value is 1.
***/
/**************
// Simple AOT > Jobs job to run the method.
static void AttributeReflection33Job(Args _args)
{
    AttributeReflection::MetadataOfSysEntryPointAttributeOnMethod
        ("CustCustomerService", "create");
}
**************/