Özel öznitelikleri yazma

Özel öznitelikler tasarlamak için birçok yeni kavram öğrenmeniz gerekmez. Nesne odaklı programlama hakkında bilgi sahibiyseniz ve sınıfları nasıl tasarlayabileceğinizi biliyorsanız, gereken bilgilerin çoğuna zaten sahipsiniz demektir. Özel öznitelikler, doğrudan veya dolaylı olarak sınıfından türetilen geleneksel sınıflardır System.Attribute . Geleneksel sınıflarda olduğu gibi özel öznitelikler de verileri depolayan ve alan yöntemler içerir.

Özel öznitelik sınıflarını düzgün tasarlamaya yönelik birincil adımlar şunlardır:

Bu bölümde bu adımların her biri açıklanır ve özel bir öznitelik örneğiyle sonuçlanmıştır.

AttributeUsageAttribute'u Uygulama

Özel öznitelik bildirimi, öznitelik sınıfınızın bazı temel özelliklerini tanımlayan özniteliğiyle System.AttributeUsageAttribute başlar. Örneğin, özniteliğinizin diğer sınıflar tarafından devralınıp devralınamayacağını veya özniteliğin hangi öğelere uygulanabileceğini belirtebilirsiniz. Aşağıdaki kod parçası, öğesinin nasıl kullanılacağını AttributeUsageAttributegösterir:

[AttributeUsage(AttributeTargets::All, Inherited = false, AllowMultiple = true)]
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
<AttributeUsage(AttributeTargets.All, Inherited:=False, AllowMultiple:=True)>
Public Class SomeClass
    Inherits Attribute
    '...
End Class

AttributeUsageAttribute özel özniteliklerin oluşturulması için önemli olan üç üyeye sahiptir: AttributeTargets, Inherited ve AllowMultiple.

AttributeTargets Üyesi

Yukarıdaki örnekte, AttributeTargets.All bu özniteliğin tüm program öğelerine uygulanabileceğini belirten belirtilir. Alternatif olarak, özniteliğinizin yalnızca bir sınıfa AttributeTargets.Methoduygulanabileceğini belirten veya özniteliğinizin yalnızca bir yönteme uygulanabileceğini belirten belirtebilirsinizAttributeTargets.Class. Tüm program öğeleri bu şekilde özel bir öznitelik tarafından açıklama için işaretlenebilir.

Birden çok AttributeTargets değer de geçirebilirsiniz. Aşağıdaki kod parçası, herhangi bir sınıfa veya yönteme özel bir özniteliğin uygulanabileceğini belirtir:

[AttributeUsage(AttributeTargets::Class | AttributeTargets::Method)]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method)>
Public Class SomeOtherClass
    Inherits Attribute
    '...
End Class

Devralınan Özellik

AttributeUsageAttribute.Inherited özelliği, özniteliğinizin, özniteliğinizin uygulandığı sınıflardan türetilen sınıflar tarafından devralınıp devralınamayacağını gösterir. Bu özellik bir true (varsayılan) veya false bayrak alır. Aşağıdaki örnekte varsayılan MyAttribute değeri , değeri ise falseInheritedYourAttribute :Inheritedtrue

// This defaults to Inherited = true.
public ref class MyAttribute : Attribute
{
    //...
};

[AttributeUsage(AttributeTargets::Method, Inherited = false)]
public ref class YourAttribute : Attribute
{
    //...
};
// This defaults to Inherited = true.
public class MyAttribute : Attribute
{
    //...
}

[AttributeUsage(AttributeTargets.Method, Inherited = false)]
public class YourAttribute : Attribute
{
    //...
}
' This defaults to Inherited = true.
Public Class MyAttribute
    Inherits Attribute
    '...
End Class

<AttributeUsage(AttributeTargets.Method, Inherited:=False)>
Public Class YourAttribute
    Inherits Attribute
    '...
End Class

İki öznitelik daha sonra temel sınıfındaki MyClassbir yönteme uygulanır:

public ref class MyClass
{
public:
    [MyAttribute]
    [YourAttribute]
    virtual void MyMethod()
    {
        //...
    }
};
public class MyClass
{
    [MyAttribute]
    [YourAttribute]
    public virtual void MyMethod()
    {
        //...
    }
}
Public Class MeClass
    <MyAttribute>
    <YourAttribute>
    Public Overridable Sub MyMethod()
        '...
    End Sub
End Class

Son olarak, sınıfı temel sınıfından YourClassMyClassdevralınır. yöntemi MyMethod şunları gösterir ancak göstermezYourAttributeMyAttribute:

public ref class YourClass : MyClass
{
public:
    // MyMethod will have MyAttribute but not YourAttribute.
    virtual void MyMethod() override
    {
        //...
    }

};
public class YourClass : MyClass
{
    // MyMethod will have MyAttribute but not YourAttribute.
    public override void MyMethod()
    {
        //...
    }
}
Public Class YourClass
    Inherits MeClass
    ' MyMethod will have MyAttribute but not YourAttribute.
    Public Overrides Sub MyMethod()
        '...
    End Sub

End Class

AllowMultiple Özelliği

özelliği, AttributeUsageAttribute.AllowMultiple bir öğede özniteliğinizin birden çok örneğinin bulunup bulunmadığını gösterir. olarak ayarlanırsa true, birden çok örneğe izin verilir. (varsayılan) olarak ayarlanırsa false yalnızca bir örneğe izin verilir.

Aşağıdaki örnekte varsayılan MyAttributeAllowMultiple değeri false, değeri ise YourAttribute : şeklindedir true.

//This defaults to AllowMultiple = false.
public ref class MyAttribute : Attribute
{
};

[AttributeUsage(AttributeTargets::Method, AllowMultiple = true)]
public ref class YourAttribute : Attribute
{
};
//This defaults to AllowMultiple = false.
public class MyAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class YourAttribute : Attribute
{
}
' This defaults to AllowMultiple = false.
Public Class MyAttribute
    Inherits Attribute
End Class

<AttributeUsage(AttributeTargets.Method, AllowMultiple:=true)>
Public Class YourAttribute
    Inherits Attribute
End Class

Bu özniteliklerin birden çok örneği uygulandığında, MyAttribute derleyici hatası oluşturur. Aşağıdaki kod örneğinde geçerli kullanımı YourAttribute ve geçersiz kullanımı gösterilmektedir MyAttribute:

public ref class MyClass
{
public:
    // This produces an error.
    // Duplicates are not allowed.
    [MyAttribute]
    [MyAttribute]
    void MyMethod()
    {
        //...
    }

    // This is valid.
    [YourAttribute]
    [YourAttribute]
    void YourMethod()
    {
        //...
    }
};
public class MyClass
{
    // This produces an error.
    // Duplicates are not allowed.
    [MyAttribute]
    [MyAttribute]
    public void MyMethod()
    {
        //...
    }

    // This is valid.
    [YourAttribute]
    [YourAttribute]
    public void YourMethod()
    {
        //...
    }
}
Public Class MyClass
    ' This produces an error.
    ' Duplicates are not allowed.
    <MyAttribute>
    <MyAttribute>
    Public Sub MyMethod()
        '...
    End Sub

    ' This is valid.
    <YourAttribute>
    <YourAttribute>
    Public Sub YourMethod()
        '...
    End Sub
End Class

Hem özelliği hem Inherited de AllowMultiple özelliği olarak trueayarlanırsa, başka bir sınıftan devralınan bir sınıf bir özniteliği devralabilir ve aynı alt sınıfa aynı özniteliğin başka bir örneğini uygulanabilir. olarak ayarlanırsa AllowMultiplefalse, üst sınıftaki özniteliklerin değerlerinin üzerine alt sınıfta aynı özniteliğin yeni örnekleri yazılır.

Öznitelik Sınıfını Bildirme

uygulamasını uyguladıktan AttributeUsageAttributesonra, özniteliğinizin özelliklerini tanımlamaya başlayın. Öznitelik sınıfının bildirimi, aşağıdaki kodda gösterildiği gibi geleneksel bir sınıfın bildirimine benzer:

[AttributeUsage(AttributeTargets::Method)]
public ref class MyAttribute : Attribute
{
    // . . .
};
[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : Attribute
{
    // . . .
}
<AttributeUsage(AttributeTargets.Method)>
Public Class MyAttribute
    Inherits Attribute
    ' . . .
End Class

Bu öznitelik tanımı aşağıdaki noktaları gösterir:

  • Öznitelik sınıfları genel sınıflar olarak bildirilmelidir.

  • Kural gereği, öznitelik sınıfının adı Öznitelik sözcüğüyle biter. Gerekli olmasa da, okunabilirlik için bu kural önerilir. Öznitelik uygulandığında, Öznitelik sözcüğünün eklenmesi isteğe bağlıdır.

  • Tüm öznitelik sınıfları doğrudan veya dolaylı olarak sınıfından System.Attribute devralmalıdır.

  • Microsoft Visual Basic'te tüm özel öznitelik sınıflarının özniteliği olmalıdır System.AttributeUsageAttribute .

Oluşturucuları Bildirme

Geleneksel sınıflarda olduğu gibi öznitelikler de oluşturucularla başlatılır. Aşağıdaki kod parçası tipik bir öznitelik oluşturucuyu gösterir. Bu ortak oluşturucu bir parametre alır ve bir üye değişkenini değerine eşit olarak ayarlar.

MyAttribute(bool myvalue)
{
    this->myvalue = myvalue;
}
public MyAttribute(bool myvalue)
{
    this.myvalue = myvalue;
}
Public Sub New(myvalue As Boolean)
    Me.myvalue = myvalue
End Sub

Oluşturucuyu, farklı değer bileşimlerini barındıracak şekilde aşırı yükleyebilirsiniz. Özel öznitelik sınıfınız için de bir özellik tanımlarsanız, özniteliği başlatırken adlandırılmış ve konumsal parametrelerin bir bileşimini kullanabilirsiniz. Genellikle, gerekli tüm parametreleri konumsal ve tüm isteğe bağlı parametreleri adlandırılmış olarak tanımlarsınız. Bu durumda, öznitelik gerekli parametre olmadan başlatılamaz. Diğer tüm parametreler isteğe bağlıdır.

Not

Visual Basic'te, bir öznitelik sınıfının oluşturucuları bağımsız ParamArray değişken kullanmamalıdır.

Aşağıdaki kod örneği, önceki oluşturucuyu kullanan bir özniteliğin isteğe bağlı ve gerekli parametreler kullanılarak nasıl uygulanabileceğini gösterir. Özniteliğin bir gerekli Boole değeri ve bir isteğe bağlı dize özelliği olduğunu varsayar.

// One required (positional) and one optional (named) parameter are applied.
[MyAttribute(false, OptionalParameter = "optional data")]
public ref class SomeClass
{
    //...
};
// One required (positional) parameter is applied.
[MyAttribute(false)]
public ref class SomeOtherClass
{
    //...
};
// One required (positional) and one optional (named) parameter are applied.
[MyAttribute(false, OptionalParameter = "optional data")]
public class SomeClass
{
    //...
}
// One required (positional) parameter is applied.
[MyAttribute(false)]
public class SomeOtherClass
{
    //...
}
' One required (positional) and one optional (named) parameter are applied.
<MyAttribute(false, OptionalParameter:="optional data")>
Public Class SomeClass
    '...
End Class

' One required (positional) parameter is applied.
<MyAttribute(false)>
Public Class SomeOtherClass
    '...
End Class

Özellikleri Bildirme

Adlandırılmış bir parametre tanımlamak veya özniteliğiniz tarafından depolanan değerleri döndürmek için kolay bir yol sağlamak istiyorsanız, bir özellik bildirin. Öznitelik özellikleri, döndürülecek veri türünün açıklamasıyla ortak varlıklar olarak bildirilmelidir. Özelliğinizin değerini tutacak değişkeni tanımlayın ve ve set yöntemleriyle get ilişkilendirin. Aşağıdaki kod örneği, özniteliğinizde bir özelliğin nasıl uygulanduğunu gösterir:

property bool MyProperty
{
    bool get() {return this->myvalue;}
    void set(bool value) {this->myvalue = value;}
}
public bool MyProperty
{
    get {return this.myvalue;}
    set {this.myvalue = value;}
}
Public Property MyProperty As Boolean
    Get
        Return Me.myvalue
    End Get
    Set
        Me.myvalue = Value
    End Set
End Property

Özel Öznitelik Örneği

Bu bölüm önceki bilgileri içerir ve kodun bir bölümünün yazarı hakkındaki bilgileri belgeleyen bir özniteliğin nasıl tasarlandığını gösterir. Bu örnekteki öznitelik, programcının adını ve düzeyini ve kodun gözden geçirilip geçirilmemiş olduğunu depolar. Kaydedilecek gerçek değerleri depolamak için üç özel değişken kullanır. Her değişken, değerleri alan ve ayarlayan bir ortak özellik ile temsil edilir. Son olarak, oluşturucu iki gerekli parametreyle tanımlanır:

[AttributeUsage(AttributeTargets::All)]
public ref class DeveloperAttribute : Attribute
{
    // Private fields.
private:
    String^ name;
    String^ level;
    bool reviewed;

public:
    // This constructor defines two required parameters: name and level.

    DeveloperAttribute(String^ name, String^ level)
    {
        this->name = name;
        this->level = level;
        this->reviewed = false;
    }

    // Define Name property.
    // This is a read-only attribute.

    virtual property String^ Name
    {
        String^ get() {return name;}
    }

    // Define Level property.
    // This is a read-only attribute.

    virtual property String^ Level
    {
        String^ get() {return level;}
    }

    // Define Reviewed property.
    // This is a read/write attribute.

    virtual property bool Reviewed
    {
        bool get() {return reviewed;}
        void set(bool value) {reviewed = value;}
    }
};
[AttributeUsage(AttributeTargets.All)]
public class DeveloperAttribute : Attribute
{
    // Private fields.
    private string name;
    private string level;
    private bool reviewed;

    // This constructor defines two required parameters: name and level.

    public DeveloperAttribute(string name, string level)
    {
        this.name = name;
        this.level = level;
        this.reviewed = false;
    }

    // Define Name property.
    // This is a read-only attribute.

    public virtual string Name
    {
        get {return name;}
    }

    // Define Level property.
    // This is a read-only attribute.

    public virtual string Level
    {
        get {return level;}
    }

    // Define Reviewed property.
    // This is a read/write attribute.

    public virtual bool Reviewed
    {
        get {return reviewed;}
        set {reviewed = value;}
    }
}
<AttributeUsage(AttributeTargets.All)>
Public Class DeveloperAttribute
    Inherits Attribute
    ' Private fields.
    Private myname As String
    Private mylevel As String
    Private myreviewed As Boolean

    ' This constructor defines two required parameters: name and level.

    Public Sub New(name As String, level As String)
        Me.myname = name
        Me.mylevel = level
        Me.myreviewed = False
    End Sub

    ' Define Name property.
    ' This is a read-only attribute.

    Public Overridable ReadOnly Property Name() As String
        Get
            Return myname
        End Get
    End Property

    ' Define Level property.
    ' This is a read-only attribute.

    Public Overridable ReadOnly Property Level() As String
        Get
            Return mylevel
        End Get
    End Property

    ' Define Reviewed property.
    ' This is a read/write attribute.

    Public Overridable Property Reviewed() As Boolean
        Get
            Return myreviewed
        End Get
        Set
            myreviewed = value
        End Set
    End Property
End Class

Bu özniteliği tam adı kullanarak veya kısaltılmış adı DeveloperAttributeDeveloperkullanarak aşağıdaki yollardan biriyle uygulayabilirsiniz:

[Developer("Joan Smith", "1")]

-or-

[Developer("Joan Smith", "1", Reviewed = true)]
[Developer("Joan Smith", "1")]

-or-

[Developer("Joan Smith", "1", Reviewed = true)]
<Developer("Joan Smith", "1")>

-or-

<Developer("Joan Smith", "1", Reviewed := true)>

İlk örnekte yalnızca gerekli adlandırılmış parametrelerle uygulanan öznitelik gösterilmektedir. İkinci örnekte hem gerekli hem de isteğe bağlı parametrelerle uygulanan öznitelik gösterilmektedir.

Ayrıca bkz.