Egyéni attribútumok elérése

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:

  1. A futtatókörnyezet ellenőrzi, hogy a típusargumentum DescriptionAttributeType.GetCustomAttributes(Type type) nyilvános-e, ezért látható és elérhető.
  2. A futtatókörnyezet ellenőrzi, hogy az abból MyDescriptionAttribute származtatott felhasználó által definiált típus DescriptionAttribute látható és elérhető-e a System.Web.dll szerelvényen belül, ahol a metódushoz GetLanguage()van csatolva.
  3. A futtatókörnyezet ellenőrzi, hogy a MyDescriptionAttribute konstruktor látható és elérhető-e a System.Web.dll összeállításon belül.
  4. 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

Lásd még