فئات سمات X++

ملاحظة

انتقلت مجموعات اهتمام المجتمع الآن من Yammer إلى Microsoft Viva Engage. للانضمام إلى مجتمع Viva Engage والمشاركة في المناقشات الأخيرة، املأ نموذج طلب الوصول إلى مجتمع Finance and Operations Viva Engage واختر المجتمع الذي تريد الانضمام إليه.

توضح هذه المقالة استخدام السمات في X++.

السمة هي فئة nonabstract التي توسع (ترث من) فئة 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. لا يقوم المحول البرمجي بإنشاء مثيل لفئة السمة. يخزن اسم فئة السمة، بالإضافة إلى القيم الحرفية لمنشئها. لذلك، إذا كان المنطق في منشئ السمة سيطرح استثناء، فإن تزيين فئة بالسمة لا يسبب الاستثناء. يتم العثور على الاستثناء لاحقا عندما تنظر عملية إلى فئة لمشاهدة السمة التي تم تزيينها بها. هذه العملية هي عندما يتم إنشاء السمة.

تقاليد التسمية

تحتوي جميع فئات السمات على سمة اللاحقة باسمها. لاحقة السمة هي اصطلاح الاسم الذي توصي به Microsoft، ولكنه ليس من متطلبات النظام. يمكنك تحديد ما إذا كانت الفئة تمتد مباشرة من SysAttribute عن طريق تحديد الفئة في مستكشف التطبيقات ومراجعة الخاصية Extends في نافذة Properties .

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

ملاحظة

لا توجد آلية لإدراج جميع الأساليب أو الفئات التي تزين بسمة معينة من التعليمات البرمجية 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");
}
**************/