X++-attribútumosztályok

Ez a cikk az attribútumok X++-ban való használatát ismerteti.

Az attribútum egy nemabstract osztály, amely kiterjeszti (örökli) a SysAttribute osztályt . Az attribútumok a típusokkal és metódusokkal kapcsolatos metaadatokat jelölik vagy tárolják. Attribútumot csatolhat egy osztályhoz, osztálymezőhöz, osztálymetódushoz, felülethez vagy táblához.

Attribútumok alkalmazása a meghatalmazottak kezelőire és metódusokra, hogy a kezelőket ezekhez a célokhoz rendelje.

Attribútumosztály létrehozása

Az attribútumosztályok kiterjeszthetik közvetlenül a SysAttribute osztályt , vagy kiterjeszthetik a SysAttribute osztály bármely leszármazottját. A SysAttribute osztály nem használható attribútumként, mert absztraktként van deklarálva. Az alábbi példa egy létrehozható szokásos attribútumosztály deklarációját és kialakítását mutatja be.

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.
}

Osztály dekorálása attribútummal

Az alábbi példa egy osztályt és egy metódust mutat be, amelyet az előző példában megadott PracticeAttribute díszít. Ha az attribútum konstruktora nem vesz fel paramétereket, a paraméterek zárójelei nem kötelezőek. Az attribútumdíszítés zárójelek nélkül is lehet [AnotherAttribute] .

[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.
}

Kihagyhatja az attribútumnév utótagját, ha az utótag .Attribute Használhatja például [Practice][PracticeAttribute] az előző példában.

Attribute constructors

Engedélyezheti az attribútumosztály számára, hogy testre szabott metaadatokat tároljon minden alkalommal, amikor egy osztályt díszít, ha a konstruktor paramétereket vesz fel. A konstruktor paramétereinek a primitív típusú literáloknak kell lenniük, például int,enum vagy str. A fordító nem hozza létre az attribútumosztály egy példányát. Tárolja az attribútumosztály nevét, valamint a konstruktor literális értékeit. Ezért ha egy attribútumkonstruktor logikája kivételt okozna, az osztály attribútummal való dekorálása nem okoz kivételt. A kivétel később jelenik meg, amikor egy folyamat megtekint egy osztályt, hogy láthassa a kidekorált attribútumot. Ez a folyamat az attribútum létrehozásakor történik.

Naming conventions

Minden attribútumosztály nevében szerepel az Attribútum utótag. Az attribútum utótagja a Microsoft által javasolt névegyezmény, de ez nem rendszerkövetelmény. Az Osztály kiterjesztése közvetlenül aSysAttribute szolgáltatásból az Application Explorerben az osztály kiválasztásával és a Tulajdonságok ablakban a Extends tulajdonság áttekintésével állapítható meg.

SysObsoleteAttribute

A rendszer számos attribútumot biztosít, köztük a SysObsoleteAttribute osztályt . A SysObsoleteAttribute osztály egyik használata, ha értesíti a fordítót arról, hogy a fordítás sikertelen lesz, ha a forráskód egy adott metódust hív meg. A fordító elutasítja a fordítást, és megjeleníti az attribútum ebben a használatában tárolt üzenetet. A SysObsoleteAttribute osztály arra is használható, hogy hiba helyett figyelmeztető üzeneteket adjon ki a fordítónak.

SysObsoleteAttribute kódpéldák

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

Metadata reflection

A tükröződés segítségével megkeresheti az osztályhoz csatolt attribútum metaadatait. Az attribútumvisszaverődéshez használandó osztályok a következők:

  • DictClass osztály – Osztályokhoz és felületekhez.
  • DictMethod osztály – Osztályok, felületek vagy táblák metódusaihoz.

Az előző tükröződési osztályokban az attribútum-metaadatok tükrözési módszerei a következők:

  • getAllAttributes method
  • getAttribute method
  • getAttributedClasses method
  • getAttributes method

Note

Nincs olyan mechanizmus, amely felsorolja az összes metódust vagy osztályt, amelyet az X++ kód egy adott attribútuma díszít. Mivel azonban az X++ fordító rögzíti ezeket az adatokat a kereszthivatkozási adatbázisban, onnan is kibányászhatja ezeket az adatokat.

Metaadat-tükrözési kód példa

A DictMethod osztály segítségével megkereshető egy metódust díszítő attribútum metaadatértéke. Az alábbi példakód a SysEntryPointAttribute osztályt használja attribútumként. Elfogadja a metódus nevéhez és a metódust tartalmazó osztály nevéhez tartozó paraméterértékeket. A parmChecked metódus a SysEntryPointAttribute osztályra tartozik, és nem öröklődik a SysAttribute alaposztályától. Minden attribútumosztály saját metódusnévvel rendelkezhet a metaadataihoz.

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");
}
**************/