Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Miután az attribútumok társítva lettek a programelemekkel, a tükröződés használható a létezésük és az értékek lekérdezésére. A .NET biztosítja azt a MetadataLoadContextkódot, amellyel megvizsgálhatja a végrehajtáshoz nem betölthető kódot.
MetadataLoadContext
A környezetbe MetadataLoadContext betöltött kód nem hajtható végre. Ez azt jelenti, hogy az egyéni attribútumok példányai nem hozhatók létre, mert ehhez a konstruktorok végrehajtása szükséges. Az MetadataLoadContext környezetben az egyéni attribútumok betöltéséhez és vizsgálatához használja a CustomAttributeData osztályt. Ennek az osztálynak a példányait a statikus CustomAttributeData.GetCustomAttributes metódus megfelelő túlterhelésével szerezheti be. További információért lásd: A szerelvény tartalmának vizsgálata a MetadataLoadContext használatával.
A végrehajtási környezet
A végrehajtási környezetben lévő attribútumok lekérdezésének fő tükröződési módszerei a következők MemberInfo.GetCustomAttributes : és Attribute.GetCustomAttributes.
Az egyéni attribútumok hozzáférhetőségét a rendszer annak az assemblynek a vonatkozásában ellenőrzi, amelyhez az attribútumot csatolták. Ez egyenértékű annak ellenőrzésével, hogy az egyéni attribútumot csatoló szerelvény egy típusának metódusa meghívhatja-e az egyéni attribútum konstruktorát.
Az olyan módszerek, mint a Assembly.GetCustomAttributes(Boolean), ellenőrzik a típusargumentum láthatóságát és hozzáférhetőségét. Csak a felhasználó által definiált típust tartalmazó szerelvény kódja tudja lekérni az adott típusú egyéni attribútumot az GetCustomAttributes használatával.
Az alábbi C#-példa egy tipikus egyéni attribútumtervezési minta. Bemutatja a futásidejű egyéni attribútumvisszaverési modellt.
System.DLL
public class DescriptionAttribute : Attribute
{
}
System.Web.DLL
internal class MyDescriptionAttribute : DescriptionAttribute
{
}
public class LocalizationExtenderProvider
{
[MyDescriptionAttribute(...)]
public CultureInfo GetLanguage(...)
{
}
}
Ha a futtatókörnyezet megpróbálja lekérni a metódushoz csatolt DescriptionAttribute nyilvános egyéni attribútumtípus GetLanguage egyéni attribútumait, a következő műveleteket hajtja végre:
- A futtatókörnyezet ellenőrzi, hogy a típusargumentum
DescriptionAttributeType.GetCustomAttributes(Type type)nyilvános-e, ezért látható és elérhető. - A futtatókörnyezet ellenőrzi, hogy az abból
MyDescriptionAttributeszármaztatott felhasználó által definiált típusDescriptionAttributelátható és elérhető-e a System.Web.dll szerelvényen belül, ahol a metódushozGetLanguage()van csatolva. - A futtatókörnyezet ellenőrzi, hogy a
MyDescriptionAttributekonstruktor látható és elérhető-e a System.Web.dll összeállításon belül. - A futtatókörnyezet meghívja az egyéni attribútumparaméterek konstruktorát
MyDescriptionAttribute, és visszaadja az új objektumot a hívónak.
Az egyéni attribútumvisszaverési modell kiszivárogtathatja a felhasználó által definiált típusok példányait azon a szerelvényen kívül, amelyben a típus definiálva van. Ez nem különbözik a futtatókörnyezeti rendszertár azon tagjaitól, amelyek felhasználó által meghatározott típusú példányokat adnak vissza, például Type.GetMethods objektumtömböt RuntimeMethodInfo adnak vissza. Ha meg szeretné akadályozni, hogy az ügyfél adatokat derítsen fel egy felhasználó által definiált egyéni attribútumtípusról, adja meg, hogy a típus tagjai ne legyenek közzétettek.
Az alábbi példa bemutatja, hogyan használhatja a tükröződést az egyéni attribútumokhoz való hozzáféréshez.
using System;
public class ExampleAttribute : Attribute
{
private string stringVal;
public ExampleAttribute()
{
stringVal = "This is the default string.";
}
public string StringValue
{
get { return stringVal; }
set { stringVal = value; }
}
}
[Example(StringValue="This is a string.")]
class Class1
{
public static void Main()
{
System.Reflection.MemberInfo info = typeof(Class1);
foreach (object attrib in info.GetCustomAttributes(true))
{
Console.WriteLine(attrib);
}
}
}
Public Class ExampleAttribute
Inherits Attribute
Private stringVal As String
Public Sub New()
stringVal = "This is the default string."
End Sub
Public Property StringValue() As String
Get
Return stringVal
End Get
Set(Value As String)
stringVal = Value
End Set
End Property
End Class
<Example(StringValue:="This is a string.")> _
Class Class1
Public Shared Sub Main()
Dim info As System.Reflection.MemberInfo = GetType(Class1)
For Each attrib As Object In info.GetCustomAttributes(true)
Console.WriteLine(attrib)
Next attrib
End Sub
End Class