UnsafeAccessorAttribute Classe

Définition

Fournit l’accès à un membre inaccessible d’un type spécifique.

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
Héritage
UnsafeAccessorAttribute
Attributs

Exemples

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());
}

Remarques

Vous pouvez appliquer cet attribut à une extern static méthode. L’implémentation de la extern static méthode annotée avec cet attribut est fournie par le runtime en fonction des informations contenues dans l’attribut et de la signature de la méthode à laquelle l’attribut est appliqué. Le runtime tente de trouver la méthode ou le champ correspondant et de lui transférer l’appel. Si la méthode ou le champ correspondant est introuvable, le corps de la extern static méthode lève MissingFieldException ou MissingMethodException.

Les paramètres génériques sont pris en charge depuis .NET 9. Les paramètres génériques doivent correspondre à la cible dans la forme et l’index (autrement dit, les paramètres de type doivent être des paramètres de type et les paramètres de méthode doivent être des paramètres de méthode). Les extern static paramètres génériques de la méthode doivent également correspondre exactement à toutes les contraintes reflétées sur la cible. Si les contraintes ne correspondent pas, la méthode lève InvalidProgramException.

Pour Method, StaticMethod, Fieldet StaticField, le type du premier argument de la méthode annotée extern static identifie le type propriétaire. Seul le type spécifique défini sera examiné pour les membres inaccessibles. La hiérarchie de types n’est pas parcourue à la recherche d’une correspondance.

La valeur du premier argument est traitée comme this pointeur pour instance champs et méthodes.

Le premier argument doit être passé comme ref pour instance champs et méthodes sur les structs.

La valeur du premier argument n’est pas utilisée par l’implémentation pour static les champs et les méthodes et peut être null.

La valeur de retour d’un accesseur à un champ peut être ref si le paramètre du champ est souhaité.

Les constructeurs sont accessibles à l’aide de Constructor ou Method.

Le type de retour est pris en compte pour la correspondance de signature. Au départ, les modreqs et les modopts ne sont pas pris en compte pour la correspondance de signature. Toutefois, s’il existe une ambiguïté qui ignore les modreqs et les modopts, une correspondance précise est tentée. Si une ambiguïté existe toujours, AmbiguousMatchException est levée.

Par défaut, le nom de la méthode attribuée dicte le nom de la méthode/du champ. Cela peut entraîner de la confusion dans certains cas, car les abstractions de langage, telles que les fonctions locales C#, génèrent des noms IL mangles. La solution consiste à utiliser le nameof mécanisme et à définir la Name propriété .

Constructeurs

UnsafeAccessorAttribute(UnsafeAccessorKind)

Instancie un UnsafeAccessorAttribute fournissant l’accès à un membre de type UnsafeAccessorKind.

Propriétés

Kind

Obtient le type de membre auquel l’accès est fourni.

Name

Obtient ou définit le nom du membre auquel l’accès est fourni.

TypeId

Lors de l'implémentation dans une classe dérivée, obtient un identificateur unique pour l'objet Attribute.

(Hérité de Attribute)

Méthodes

Equals(Object)

Retourne une valeur qui indique si cette instance est égale à un objet spécifié.

(Hérité de Attribute)
GetHashCode()

Retourne le code de hachage de cette instance.

(Hérité de Attribute)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
IsDefaultAttribute()

En cas de substitution dans une classe dérivée, indique si la valeur de cette instance est la valeur par défaut pour la classe dérivée.

(Hérité de Attribute)
Match(Object)

En cas de substitution dans une classe dérivée, retourne une valeur indiquant si cette instance équivaut à un objet spécifié.

(Hérité de Attribute)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

S’applique à