UnsafeAccessorAttribute Třída

Definice

Poskytuje přístup k nepřístupným členům určitého typu.

public ref class UnsafeAccessorAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
public sealed class UnsafeAccessorAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)>]
type UnsafeAccessorAttribute = class
    inherit Attribute
Public NotInheritable Class UnsafeAccessorAttribute
Inherits Attribute
Dědičnost
UnsafeAccessorAttribute
Atributy

Příklady

public class Class
{
    static void StaticPrivateMethod() { }
    static int StaticPrivateField;
    Class(int i) { PrivateField = i; }
    void PrivateMethod() { }
    int PrivateField;
    int PrivateProperty { get => PrivateField; }
}

public void CallStaticPrivateMethod()
{
    StaticPrivateMethod(null);

    [UnsafeAccessor(UnsafeAccessorKind.StaticMethod, Name = nameof(StaticPrivateMethod))]
    extern static void StaticPrivateMethod(Class c);
}
public void GetSetStaticPrivateField()
{
    ref int f = ref GetSetStaticPrivateField(null);

    [UnsafeAccessor(UnsafeAccessorKind.StaticField, Name = "StaticPrivateField")]
    extern static ref int GetSetStaticPrivateField(Class c);
}
public void CallPrivateConstructor()
{
    Class c1 = PrivateCtor(1);

    Class c2 = (Class)RuntimeHelpers.GetUninitializedObject(typeof(Class));

    PrivateCtorAsMethod(c2, 2);

    [UnsafeAccessor(UnsafeAccessorKind.Constructor)]
    extern static Class PrivateCtor(int i);

    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
    extern static void PrivateCtorAsMethod(Class c, int i);

}
public void CallPrivateMethod(Class c)
{
    PrivateMethod(c);

    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = nameof(PrivateMethod))]
    extern static void PrivateMethod(Class c);
}
public void GetPrivateProperty(Class c)
{
    int f = GetPrivateProperty(c);

    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "get_PrivateProperty")]
    extern static int GetPrivateProperty(Class c);
}
public void GetSetPrivateField(Class c)
{
    ref int f = ref GetSetPrivateField(c);

    [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "PrivateField")]
    extern static ref int GetSetPrivateField(Class c);
}

// Generic example
public class Class<T>
{
    private T _field;
    private void M(T t) { }
    private void GM<U>(U u) { }
    private void GMWithConstraints<U, V>(U u, V v) where U : V, IEquatable<U> { }
}

class Accessors<V>
{
    [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_field")]
    public extern static ref V GetSetPrivateField(Class<V> c);

    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "M")]
    public extern static void CallM(Class<V> c, V v);

    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "GM")]
    public extern static void CallGM<X>(Class<V> c, X x);

    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "GMWithConstraints")]
    public extern static void CallGMWithConstraints<X, Y>(Class<V> c, X x, Y y) where X : Y, IEquatable<X>;
}

public void AccessGenericType(Class<int> c)
{
    ref int f = ref Accessors<int>.GetSetPrivateField(c);

    Accessors<int>.CallM(c, 1);

    Accessors<int>.CallGM<string>(c, string.Empty);

    Accessors<int>.CallGMWithConstraints<string, object>(c, string.Empty, new object());
}

Poznámky

Tento atribut můžete použít na metodu extern static . Implementace extern static metody anotované s tímto atributem bude poskytována modulem runtime na základě informací v atributu a podpisu metody, na kterou je atribut použit. Modul runtime se pokusí najít odpovídající metodu nebo pole a přesměrovat volání na něj. Pokud není nalezena odpovídající metoda nebo pole, tělo metody vyvolá MissingFieldException metodu extern static nebo MissingMethodException.

Obecné parametry jsou podporovány od verze .NET 9. Obecné parametry musí odpovídat cíli ve formuláři a indexu (to znamená, že parametry typu musí být parametry typu a parametry metody musí být parametry metody). Obecné extern static parametry metody musí také přesně odpovídat všem omezením, která se projeví v cíli. Pokud se omezení neshodují, metoda vyvolá InvalidProgramException.

Pro Method, StaticMethod, Fielda StaticFieldtyp prvního argumentu metody s poznámkami extern static identifikuje vlastnící typ. Nepřístupné členy se budou zkoumat pouze u konkrétního definovaného typu. Hierarchie typů se nechodí a hledá shodu.

Hodnota prvního argumentu je považována za this ukazatel pro pole a metody instance.

První argument musí být předán jako ref pro pole instance a metody ve strukturách.

Hodnota prvního argumentu se nepoužívá v implementaci pro static pole a metody a může být null.

Návratová hodnota pro přístup k poli může být ref , pokud je nastavení pole žádoucí.

Konstruktory jsou přístupné pomocí nebo ConstructorMethod.

Návratový typ se považuje za shodu podpisu. Modreqs a modopts se zpočátku při shodě podpisu nezohlední. Pokud však existuje nejednoznačnost bez ohledu na modreqs a modopts, pokusí se o přesnou shodu. Pokud stále existuje nejednoznačnost, AmbiguousMatchException vyvolá se .

Ve výchozím nastavení název metody s atributem určuje název metody nebo pole. To může v některých případech způsobit nejasnosti, protože abstrakce jazyka, jako jsou místní funkce jazyka C#, generují popletené názvy IL. Řešením je použít nameof mechanismus a definovat Name vlastnost .

Konstruktory

UnsafeAccessorAttribute(UnsafeAccessorKind)

UnsafeAccessorAttribute Vytvoří instanci poskytujícího přístup k druhu UnsafeAccessorKindčlena .

Vlastnosti

Kind

Získá typ členu, ke kterému je poskytován přístup.

Name

Získá nebo nastaví název člena, ke kterému je poskytován přístup.

TypeId

Při implementaci v odvozené třídě získá jedinečný identifikátor pro tuto Attributetřídu .

(Zděděno od Attribute)

Metody

Equals(Object)

Vrací hodnotu, která určuje, zda je tato instance rovna zadanému objektu.

(Zděděno od Attribute)
GetHashCode()

Vrátí hodnotu hash pro tuto instanci.

(Zděděno od Attribute)
GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
IsDefaultAttribute()

Při přepsání v odvozené třídě označuje, zda je hodnota této instance výchozí hodnotou pro odvozenou třídu.

(Zděděno od Attribute)
Match(Object)

Při přepsání v odvozené třídě vrátí hodnotu, která označuje, zda se tato instance rovná zadanému objektu.

(Zděděno od Attribute)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Platí pro