Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Skupiny zájmu komunity se teď přesunuly z Yammeru na Microsoft Viva Engage. Pokud se chcete připojit k komunitě Viva Engage a účastnit se nejnovějších diskuzí, vyplňte formulář Žádost o přístup k aplikaci Finance and Operations Viva Engage Community a zvolte komunitu, ke které se chcete připojit.
Tento článek popisuje použití atributů v X++.
Atribut je non-abstraktní třída, která rozšiřuje (dědí z) SysAttribute třídy. Atributy představují nebo ukládají metadata o typech a metodách. Atribut lze připojit ke třídě, poli třídy, metodě třídy, rozhraní nebo tabulce.
Atributy se použijí na obslužné rutiny delegátů a metod, které mapují obslužné rutiny na tyto cíle.
Vytvoření třídy atributů
Třída atributu může rozšířit SysAttribute třídy přímo, nebo může rozšířit jakékoli potomky SysAttribute třídy. Třídu SysAttribute nelze použít jako atribut, protože je deklarována jako abstraktní. Následující příklad ukazuje deklaraci a návrh běžné třídy atributů, kterou byste mohli vytvořit.
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.
}
Dekódování třídy atributem
Následující příklad ukazuje třídu a metodu, které jsou zdobeny PracticeAttribute uvedené v předchozím příkladu. Pokud konstruktor atributu nepřijímá žádné parametry, jsou závorky parametrů volitelné. Dekorace atributů může být [AnotherAttribute] bez závorek.
[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.
}
Příponu názvu atributu můžete vynechat, pokud je Attributepřípona . Můžete například použít [Practice] místo toho [PracticeAttribute] v předchozím příkladu.
Konstruktory atributů
Třídu atributů můžete povolit, aby při každém použití k dekoraci třídy ukládaly přizpůsobená metadata tím, že jeho konstruktor převezme parametry. Parametry konstruktoru musí být literály primitivních typů, jako jsou int,enum nebo str. Kompilátor nekonstruuje instanci třídy atributu. Ukládá název třídy atributu a hodnoty literálů pro jeho konstruktor. Proto pokud logika v konstruktoru atributu vyvolá výjimku, výjimka by nebyla nalezena dekódováním třídy s atributem. Výjimka by byla nalezena později, když proces podívá na třídu, aby viděl atribut, který je dekorován. To je v případech, kdy je atribut vytvořen.
Názvoslovné konvence
Všechny třídy atributů mají příponu Atribut v jejich názvu. Přípona atributu je konvence názvů, kterou doporučujeme, ale nejedná se o systémový požadavek. Můžete určit, zda třída rozšiřuje přímo z SysAttribute výběrem třídy v Průzkumníku aplikací a kontrolou Extends vlastnost v okně Vlastnosti .
SysObsoleteAttribute
Systém poskytuje několik atributů, včetně SysObsoleteAttribute třída. Jedním z použití SysObsoleteAttribute třídy je oznámit kompilátoru, že kompilace by měla selhat, pokud je volána konkrétní metoda ve zdrojovém kódu. Kompilátor odmítne kompilaci a zobrazí konkrétní zprávu uloženou v tomto použití atributu. SysObsoleteAttribute třída lze také použít k upozorňující kompilátoru na vydání upozornění zprávy místo chyb.
Příklad kódu SysObsoleteAttribute
[SysObsoleteAttribute("The Automobile class might have faster performance.", false)]
class Bicycle
{
// Members of the Bicycle class go here.
}
Reflexe metadat
Reflexe slouží k vyhledání metadat atributů, která jsou připojena ke třídě. Třídy, které se mají použít pro reflexi atributů, jsou následující:
- DictClass – pro třídy a rozhraní.
- DictMethod – pro metody tříd, rozhraní nebo tabulek.
V předchozích třídách reflexe jsou metody pro vyjádření metadat atributů následující:
- getAllAttributes – metoda
- metoda getAttribute
- getAttributedClasses – metoda
- metoda getAttributes
Poznámka:
Neexistuje žádný mechanismus pro výpis všech metod nebo tříd, které jsou označené konkrétním atributem z kódu X++. Vzhledem k tomu, že kompilátor X++ zaznamenává tyto informace v databázi křížového odkazu, je možné tyto informace odsud minovat.
Příklad kódu reflexe metadat
Pomocí DictMethod třídy najít metadata hodnotu atributu, který je dekorace metody. Následující příklad kódu používá SysEntryPointAttribute třídy jako atribut. Přijímá hodnoty parametrů pro název metody a pro název třídy, která obsahuje metodu. Metoda parmChecked je konkrétní pro SysEntryPointAttribute třídy a není zděděna ze základní třídy SysAttribute. Každá třída atributu může mít pro svá metadata vlastní název metody.
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");
}
**************/