X++ öznitelik sınıfları

Bu makalede X++'ta özniteliklerin kullanımı açıklanmaktadır.

Öznitelik, SysAttribute sınıfını genişleten (devralan) bir kısıtlama olmayan sınıftır. Öznitelikler, türler ve yöntemlerle ilgili meta verileri temsil eder veya depolar. Bir sınıfa, sınıf alanına, sınıf yöntemine, arabirime veya tabloya öznitelik ekleyebilirsiniz.

İşleyicileri bu hedeflerle eşlemek için temsilcilerin ve yöntemlerin işleyicilerine öznitelikler uygulayın.

Öznitelik sınıfı oluşturma

Bir öznitelik sınıfı SysAttribute sınıfını doğrudan genişletebilir veya SysAttribute sınıfının herhangi bir alt öğesini genişletebilir. SysAttributesınıfını soyut olarak bildirildiği için öznitelik olarak kullanamazsınız. Aşağıdaki örnek, oluşturabileceğiniz sıradan bir öznitelik sınıfının bildirimini ve tasarımını gösterir.

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

Özniteliği olan bir sınıfın dekorasyonu

Aşağıdaki örnekte, önceki örnekte verilen PracticeAttribute ile dekore edilmiş bir sınıf ve yöntem gösterilmektedir. Özniteliğin oluşturucusunun parametresi yoksa, parametrelerin parantezleri isteğe bağlıdır. Öznitelik dekorasyonu parantez olmadan olabilir [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.
}

Sonek ise öznitelik adının son ekini Attributeatlayabilirsiniz. Örneğin, önceki örnekte bunun yerine [Practice] kullanabilirsiniz[PracticeAttribute].

Attribute constructors

Öznitelik sınıfınızı, oluşturucuslarının parametre almasını sağlayarak bir sınıfı her süslediğinden uyarlanmış meta verileri depolamak için etkinleştirebilirsiniz. Oluşturucunun parametreleri int,enum veya str gibi ilkel türlerin değişmez değerleri olmalıdır. Derleyici öznitelik sınıfının bir örneğini oluşturmaz. Öznitelik sınıfının adını ve oluşturucusunun değişmez değerlerini depolar. Bu nedenle, bir öznitelik oluşturucusunda mantık bir özel durum oluşturursa, özniteliğiyle bir sınıfın dekorasyonu özel duruma neden olmaz. Özel durum, daha sonra bir işlem bir sınıfa bakarak süslendiği özniteliği gördüğünde bulunur. Bu işlem, özniteliğin oluşturulduğunda gerçekleştirilir.

Naming conventions

Tüm öznitelik sınıflarının adında Sonek Özniteliği vardır. Öznitelik son eki, Microsoft'un önerdiği ad kuralıdır, ancak bu bir sistem gereksinimi değildir. Uygulama Gezgini'nde sınıfı seçip Özellikler penceresinde Extends özelliğini gözden geçirerek bir sınıfın doğrudan SysAttribute'tangenişletilip genişletmeyeceğini belirleyebilirsiniz.

SysObsoleteAttribute

Sistem SysObsoleteAttribute sınıfı da dahil olmak üzere çeşitli öznitelikler sağlar. SysObsoleteAttribute sınıfının bir kullanımı, kaynak kodda belirli bir yöntem çağrılırsa derlemenin başarısız olması gerektiğini derleyiciye bildirmektir. Derleyici derlemeyi reddeder ve özniteliğin bu kullanımında depolanan belirli iletiyi görüntüler. SysObsoleteAttribute sınıfı, derleyiciye hata yerine uyarı iletileri vermesini bildirmek için de kullanılabilir.

SysObsoleteAttribute kod örneği

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

Metadata reflection

Bir sınıfa bağlı öznitelik meta verilerini bulmak için yansımayı kullanırsınız. Öznitelik yansıması için kullanılacak sınıflar aşağıdaki gibidir:

  • DictClass sınıfı – Sınıflar ve arabirimler için.
  • DictMethod sınıfı – Sınıflar, arabirimler veya tablolardaki yöntemler için.

Önceki yansıma sınıflarında, öznitelik meta verilerine yansıtma yöntemleri aşağıdaki gibidir:

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

Note

X++ kodundan belirli bir öznitelikle süslenmiş tüm yöntemleri veya sınıfları listelemek için bir mekanizma yoktur. Ancak, X++ derleyicisi bu bilgileri çapraz başvuru veritabanına kaydettiğinden, bu bilgileri oradan mayınlayabilirsiniz.

Meta veri yansıma kodu örneği

Yöntemi süsleyen bir özniteliğin meta veri değerini bulmak için DictMethod sınıfını kullanın. Aşağıdaki kod örneği, özniteliği olarak SysEntryPointAttribute sınıfını kullanır. Yöntem adı ve yöntemini içeren sınıfın adı için parametre değerlerinizi kabul eder. parmChecked yöntemi SysEntryPointAttribute sınıfına özgüdür ve sysAttribute temel sınıfından devralınmamıştır. Her öznitelik sınıfının meta verileri için kendi yöntem adı olabilir.

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