گاهی اوقات پیش میاد که یکسری اطلاعات توصیفی برای هر یک از انواع متادیتای (class ها ، property ها ، method ها و ...) شما لازم باشه. مثلا فرض کنید شما می خواهید یک flag برای بعضی از property های خودتون مشخص کنید که اونها رو از بقیه متمایز می کنه . یا مثلا می خواهید اسم نویسنده اون رو بهش اضافه کنید. به طور کلی attribute ها برای مشخص کردن اطلاعاتی بیش از scope یکی از عناصر متادیتا بوجود آمده اند. پس attribute ها صرفا فقط برای property ها استفاده نمی شن و شما می تونید از اونها برای هر نوع از انواع متادیتا استفاده کنید. ولی البته کسی که یک attribute رو نوشته می تونه مشخص کنه که اون attribute برای چه عنصر یا عناصری استفاده بشه.
با این توضیحات می شه گفت تنها قانونی که وجود داره دونستن اینه که چه attribute ای کجا استفاده بشه. که اون هم فقط از طریق MSDN قابل فهمیدن.
در آخر یک مثال فکر کنم همه چیز رو روشن کنه:
فرض کنید یک attribute به این صورت تعریف شده باشه:
<AttributeUsage(AttributeTargets.All)> Public Class DeveloperAttribute
Inherits Attribute
Protected mvarName As String
Public Sub New(ByVal name As String)
Me.mvarName = name
End Sub
Public Property Name() As String
Get
Return mvarName
End Get
Set(ByVal Value As String)
mvarName = Value
End Set
End Property
End Class
توجه کنید که target در این attribute همه (all) مشخص شده.
حالا به این صورت ازش استفاده میشه:
Class DeveloperTest
<Developer("hashem")> Public Sub myMethod()
End Sub
<Developer("ALI")> Public ReadOnly Property myProp() As Boolean
Get
Return True
End Get
End Property
End Class
و برای دسترسی به attribute ها هم به این صورت عمل میشه:
Dim dt As New DeveloperTest
Dim dtType As Type = dt.GetType()
Dim mi As System.Reflection.MemberInfo
Dim attr As Attribute
For Each mi In dtType.GetMembers()
For Each attr In Attribute.GetCustomAttributes(mi)
If TypeOf attr Is DeveloperAttribute Then
Dim attrCustom As DeveloperAttribute = CType(attr, DeveloperAttribute)
MsgBox(mi.GetType.ToString & " " & mi.Name() & " has developed by " & attrCustom.Name & " .")
End If
Next
Next
یه چیزی رو که یادم رفت بگم اینه که ما اینجا یک custom attribute تعریف کردیم.