Κοινοποίηση μέσω


χαρακτηριστικών X++

Note

Οι ομάδες ενδιαφέροντος της κοινότητας έχουν πλέον μετακινηθεί από το Yammer στο Microsoft Viva Engage. Για να συμμετάσχετε σε μια κοινότητα Viva Engage και να συμμετάσχετε στις τελευταίες συζητήσεις, συμπληρώστε τη φόρμα Αίτηση πρόσβασης στο Finance and Operations Viva Engage Community και επιλέξτε την κοινότητα στην οποία θέλετε να συμμετάσχετε.

Αυτό το άρθρο περιγράφει τη χρήση χαρακτηριστικών σε X++.

Ένα χαρακτηριστικό είναι μια μη αφηρημένη κλάση που επεκτείνει (λαμβάνει από) την κλάση SysAttribute . Τα χαρακτηριστικά αντιπροσωπεύουν ή αποθηκεύουν μετα-δεδομένα σχετικά με τύπους και μεθόδους. Ένα χαρακτηριστικό μπορεί να επισυναφθεί σε μια κλάση, ένα πεδίο κλάσης, μια μέθοδο κλάσης, μια διασύνδεση ή έναν πίνακα.

Χαρακτηριστικά εφαρμόζονται στους χειρισμούς των αντιπροσώπων και των μεθόδων, για να αντιστοιχιστείτε τους χειρισμούς σε αυτούς τους στόχους.

Δημιουργία μιας κλάσης χαρακτηριστικού

Μια κλάση χαρακτηριστικού μπορεί να επεκτείνει απευθείας την κλάση SysAttribute ή μπορεί να επεκτείνει οποιονδήποτε φθίνουσα της κλάσης SysAttribute . Η κλάση SysAttribute δεν μπορεί να χρησιμοποιηθεί ως χαρακτηριστικό, επειδή δηλώνεται αφηρημένη. Το παρακάτω παράδειγμα εμφανίζει τη δήλωση και σχεδίαση μιας συνηθισμένης κλάσης χαρακτηριστικού που θα μπορούσατε να δημιουργήσετε.

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

Διακόσμηση μιας κλάσης με ένα χαρακτηριστικό

Το παρακάτω παράδειγμα δείχνει μια κλάση και μια μέθοδο που είναι διακοσμημένες με το PracticeAttribute που δίνεται στο προηγούμενο παράδειγμα. Εάν η κατασκευή του χαρακτηριστικού δεν λαμβάνει παραμέτρους, οι παρενθέσεις για τις παραμέτρους είναι προαιρετικές. Η διακόσμηση του χαρακτηριστικού μπορεί να είναι [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.
}

Μπορείτε να παραλείψετε το επίθημα του ονόματος χαρακτηριστικού, εάν το επίθημα είναι Attribute. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε [Practice] το αντί για [PracticeAttribute] αυτό στο προηγούμενο παράδειγμα.

Κατασκευές χαρακτηριστικού

Μπορείτε να ενεργοποιήσετε την κλάση χαρακτηριστικού σας για να αποθηκεύσετε προσαρμοσμένα μετα-δεδομένα κάθε φορά που χρησιμοποιείται για τη διακόσμηση μιας κλάσης, χρησιμοποιώντας τις παραμέτρους της κατασκευής της. Οι παράμετροι για την κατασκευή πρέπει να είναι λεκτικές σταθερές των στοιχειώδεις τύπων, όπως int,enum ή str. Το πρόγραμμα μεταγλώττισης δεν κατασκευάζει μια παρουσία της κλάσης χαρακτηριστικού. Αποθηκεύει το όνομα της κλάσης χαρακτηριστικού, καθώς και τις τιμές λεκτικής σταθεράς για την κατασκευή της. Επομένως, εάν η λογική σε μια κατασκευή χαρακτηριστικού θα παρουσίαζε μια εξαίρεση, η εξαίρεση δεν θα βρεθεί με τη διακόσμηση μιας κλάσης με το χαρακτηριστικό . Η εξαίρεση θα βρεθεί αργότερα όταν μια διαδικασία εξετάζει μια κλάση για να δει το χαρακτηριστικό με το οποίο είναι διακοσμημένη. Τότε είναι που κατασκευάζεται το χαρακτηριστικό.

Κανόνες ονοματοθεσίας

Όλες οι χαρακτηριστικών έχουν το χαρακτηριστικό επιθήματος στο όνομά τους. Το επίθημα Attribute είναι η σύμβαση ονόματος που προτείνουμε, αλλά δεν αποτελεί απαίτηση συστήματος. Μπορείτε να προσδιορίσετε εάν μια κλάση επεκτείνεται απευθείας από το SysAttribute , επιλέγοντας την κλάση στην Εξερεύνηση εφαρμογών και εξετάζοντας την ιδιότητα Επεκτείνεται στο παράθυρο Ιδιότητες .

SysObsoleteAttribute

Το σύστημα παρέχει διάφορα χαρακτηριστικά, συμπεριλαμβανομένης της κλάσης SysObsoleteAttribute . Μία χρήση της κλάσης SysObsoleteAttribute είναι να ειδοποιηθεί το πρόγραμμα μεταγλώττισης ότι η μεταγλώττιση θα αποτύχει εάν μια συγκεκριμένη μέθοδος καλείται στον πηγαίο κώδικα. Το πρόγραμμα μεταγλώττισης απορρίπτει τη μεταγλώττιση και εμφανίζει το συγκεκριμένο μήνυμα που είναι αποθηκευμένο σε αυτήν τη χρήση του χαρακτηριστικού. Η κλάση SysObsoleteAttribute μπορεί επίσης να χρησιμοποιηθεί για την ειδοποίηση του μεταγλωττιστή για την έκδοση προειδοποιητικών μηνυμάτων αντί για σφάλματα.

Παράδειγμα κώδικα SysObsoleteAttribute

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

Αντανάκλαση μετα-δεδομένων

Χρησιμοποιείτε αντανάκλαση για να βρείτε τα μετα-δεδομένα χαρακτηριστικού που συνδέονται σε μια κλάση. Οι που θα χρησιμοποιηθούν για την αντανάκλαση χαρακτηριστικού είναι οι εξής:

  • Κλάση κλάσης DictClass – Για και διασυνδέσεις.
  • Κλάση DictMethod – Για μεθόδους σε, διασυνδέσεις ή πίνακες.

Στις προηγούμενες αντανάκλασης, οι μέθοδοι για τον αντικατοπτρισμό των μετα-δεδομένων χαρακτηριστικών είναι οι εξής:

  • μέθοδος getAllAttributes
  • μέθοδος getAttribute
  • μέθοδος getAttributedClasses
  • μέθοδος getAttributes

Note

Δεν υπάρχει μηχανισμός για την παράθεση όλων των μεθόδων ή των κλάσεων που φέρουν ένα συγκεκριμένο χαρακτηριστικό από τον κώδικα X++. Ωστόσο, επειδή το πρόγραμμα μεταγλώττισης X++ καταγράφει αυτές τις πληροφορίες στη βάση δεδομένων παραπομπής, οι πληροφορίες μπορούν να εξαχθούν από εκεί.

Παράδειγμα κώδικα αντανάκλασης μετα-δεδομένων

Χρησιμοποιείτε την κλάση DictMethod για να βρείτε την τιμή μετα-δεδομένων ενός χαρακτηριστικού που είναι διακοσμητικό σε μια μέθοδο. Το παρακάτω παράδειγμα κώδικα χρησιμοποιεί την κλάση SysEntryPointAttribute ως χαρακτηριστικό. Αποδέχεται τις τιμές παραμέτρων σας για το όνομα της μεθόδου και για το όνομα της κλάσης που περιέχει τη μέθοδο . Η μέθοδος parmChecked είναι συγκεκριμένη για την κλάση SysEntryPointAttribute και δεν μεταβιβάζεται από τη βασική κλάση SysAttribute. Κάθε κλάση χαρακτηριστικού μπορεί να έχει το δικό της όνομα μεθόδου για τα μετα-δεδομένα της.

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