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

Obecné parametry jsou podporovány, protože .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 promítnou do cíle. Pokud se omezení neshodují, metoda vyvolá InvalidProgramException.

Pro Method, , FieldStaticMethoda StaticField, typ prvního argumentu anotované extern static metody 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 pole instance a metody pro struktury.

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 musí být předána jako ref.

K konstruktorům lze přistupovat pomocí Constructor nebo Method.

Shoda se určuje 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 nejednoznačnost stále existuje, AmbiguousMatchException je vyvoláno.

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 nameof mechanismus a definovat Name vlastnost.

Konstruktory

Name Description
UnsafeAccessorAttribute(UnsafeAccessorKind)

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

Vlastnosti

Name Description
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

Name Description
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