Piezīmes
Lai piekļūtu šai lapai, ir nepieciešama autorizācija. Varat mēģināt pierakstīties vai mainīt direktorijus.
Lai piekļūtu šai lapai, ir nepieciešama autorizācija. Varat mēģināt mainīt direktorijus.
Šajā rakstā ir aprakstīta atribūtu izmantošana programmā X++.
Atribūts ir neabstrakta klase, kas paplašina (pārmanto) klasi SysAttribute . Atribūti attēlo vai glabā metadatus par tipiem un metodēm. Atribūtu var pievienot klasei, klases laukam, klases metodei, interfeisam vai tabulai.
Lietojiet atribūtus pārstāvju apdarinātājiem un metodēm, lai kartētu apdarinātājus uz šiem mērķiem.
Atribūtu klases izveide
Atribūtu klase var paplašināt SysAttribute klasi tieši vai jebkuru SysAttribute klases pēcnācēju . Klasi SysAttribute nevar izmantot kā atribūtu, jo tā ir pasludināta par abstraktu. Tālāk sniegtajā piemērā ir parādīta parastās atribūtu klases deklarācija un noformējums, ko varat izveidot.
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.
}
Klases dekorēšana ar atribūtu
Šajā piemērā ir parādīta klase un metode, kas ir dekorēta ar iepriekšējā piemērā doto atribūtu PracticeAttribute . Ja atribūta konstruktors neizmanto parametrus, parametru iekavas nav obligātas. Atribūta rotājums varētu būt [AnotherAttribute] bez iekavām.
[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.
}
Atribūta nosaukuma sufiksu var izlaist, ja sufikss ir Attribute. Piemēram, tā vietā [Practice] varat izmantot [PracticeAttribute] iepriekšējā piemērā.
Attribute constructors
Varat iespējot atribūtu klasi, lai saglabātu pielāgotus metadatus katru reizi, kad tā rotā klasi, izmantojot tās konstruktora parametrus. Konstruktora parametriem jābūt primitīvo tipu literāļiem, piemēram, int,enum vai str. Kompilators neveido atribūta klases instanci. Tajā tiek saglabāts atribūta klases nosaukums, kā arī tās konstruktora burtiskās vērtības. Tāpēc, ja atribūta konstruktora loģika rada izņēmumu, klases dekorēšana ar atribūtu nerada izņēmumu. Izņēmums tiek atrasts vēlāk, kad process aplūko klasi, lai redzētu atribūtu, ar kuru tā ir dekorēta. Šis process ir tad, kad atribūts tiek veidots.
Naming conventions
Visu atribūtu klašu nosaukumā ir sufikss Atribūts . Atribūta sufikss ir nosaukuma konvencija, ko iesaka Microsoft, bet tā nav sistēmas prasība. Varat noteikt, vai klase paplašinās tieši no SysAttribute , atlasot klasi lietojumprogrammu pārlūkā un pārskatot rekvizītu Extended logā Properties .
SysObsoleteAttribute
Sistēma nodrošina vairākus atribūtus, tostarp klasi SysObsoleteAttribute . Viens no SysObsoleteAttribute klases lietojumiem ir paziņot kompilatoram, ka kompilācija neizdodas, ja avota kodā tiek izsaukta noteikta metode. Kompilators noraida kompilāciju un parāda konkrētu ziņojumu, kas tiek saglabāts šajā atribūta lietojumā. Klasi SysObsoleteAttribute var izmantot arī, lai paziņotu kompilatoram par brīdinājuma ziņojumu izdošanu, nevis kļūdām.
SysObsoleteAttribute koda piemērs
[SysObsoleteAttribute("The Automobile class might have faster performance.", false)]
class Bicycle
{
// Members of the Bicycle class go here.
}
Metadata reflection
Refleksija tiek izmantota, lai atrastu klasei pievienotos atribūta metadatus. Atribūtu atspoguļošanai izmantojamās klases ir šādas:
- DictClass klase — klasēm un saskarnēm.
- DictMethod klase — klasēm, interfeisiem vai tabulām.
Iepriekšējās pārdomu klasēs atribūtu metadatu atspoguļošanas metodes ir šādas:
- getAllAttributes method
- getAttribute method
- getAttributedClasses method
- getAttributes method
Note
Nav mehānisma, lai uzskaitītu visas metodes vai klases, kas ir rotātas ar konkrētu atribūtu no X++ koda. Tomēr, tā kā X++ kompilators ieraksta šo informāciju savstarpējo atsauču datu bāzē, šo informāciju var iegūt no turienes.
Metadatu atspoguļojuma koda piemērs
Izmantojiet klasi DictMethod , lai atrastu metadatu vērtību atribūtam, kas rotā metodi. Šajā koda piemērā kā atribūts tiek izmantota klase SysEntryPointAttribute . Tas akceptē parametru vērtības metodes nosaukumam un tās klases nosaukumam, kurā ir metode. Metode parmChecked ir raksturīga klasei SysEntryPointAttribute , un tā nav pārmantota no tās pamatklases SysAttribute. Katrai atribūta klasei var būt savs metadatu metodes nosaukums.
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");
}
**************/