Sdílet prostřednictvím


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 u metody extern static. Implementace extern static metody anotace 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 do něj volání. Pokud není nalezena odpovídající metoda nebo pole, tělo metody extern static vyvolá MissingFieldException nebo MissingMethodException.

Obecné parametry jsou podporované 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é parametry metody extern static také musí 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 StaticField, typ prvního argumentu anotované extern static metoda identifikuje vlastní typ. Pro nepřístupné členy se prověří pouze konkrétní typ definovaný. Hierarchie typů není procházaná hledáním shody.

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 a metody instance struktur.

Hodnota prvního argumentu není použita implementací 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 požadované nastavení pole.

Konstruktory lze získat přístup pomocí Constructor nebo Method.

Shoda je určena porovnáním podpisů metadat definovaných v oddílu II.23.2 ECMA-335. Návratový typ se považuje za shodu podpisu. Modreqs a modopty se zpočátku nepovažují za shodu podpisu. Pokud však existuje nejednoznačnost ignorování modreqs a modopts, pokusí se o přesnou shodu. Pokud stále existuje nejednoznačnost, AmbiguousMatchException je vyvolán.

Ve výchozím nastavení název atributové metody 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í mangled IL názvy. Řešením je použít mechanismus nameof a definovat vlastnost Name.

Konstruktory

UnsafeAccessorAttribute(UnsafeAccessorKind)

Vytvoří instanci UnsafeAccessorAttribute poskytující přístup k členovi typu UnsafeAccessorKind.

Vlastnosti

Kind

Získá typ člena, ke kterému je poskytnut přístup.

Name

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

TypeId

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

(Zděděno od Attribute)

Metody

Equals(Object)

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

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

Vrátí kód hash pro tuto instanci.

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

Získá Type aktuální instance.

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

Při přepsání v odvozené třídě určuje, zda hodnota této instance je 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á určuje, zda se tato instance rovná zadanému objektu.

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

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

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

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

(Zděděno od Object)

Platí pro