UnsafeAccessorAttribute Klasse

Definition

Bietet Zugriff auf einen nicht zugänglichen Member eines bestimmten Typs.

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
Vererbung
UnsafeAccessorAttribute
Attribute

Beispiele

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

Hinweise

Sie können dieses Attribut auf eine extern static Methode anwenden. Die Implementierung der extern static Mit diesem Attribut kommentierten Methode wird von der Runtime basierend auf den Informationen im Attribut und der Signatur der Methode bereitgestellt, auf die das Attribut angewendet wird. Die Laufzeit versucht, die übereinstimmende Methode oder das entsprechende Feld zu finden, und leitet den Aufruf daran weiter. Wenn die übereinstimmende Methode oder das übereinstimmende Feld nicht gefunden wird, löst MissingFieldException der Text der extern static Methode oder ausMissingMethodException.

Generische Parameter werden seit .NET 9 unterstützt. Generische Parameter müssen mit dem Ziel in Form und Index übereinstimmen (d. a. Typparameter müssen Typparameter und Methodenparameter Methodenparameter sein). Die extern static generischen Parameter der Methode müssen auch genau mit allen Einschränkungen übereinstimmen, die auf dem Ziel widerspiegelt werden. Wenn einschränkungen nicht übereinstimmen, löst die -Methode aus InvalidProgramException.

Für Method, StaticMethod, Fieldund StaticFieldidentifiziert der Typ des ersten Arguments der kommentierten extern static Methode den besitzenden Typ. Nur der bestimmte Typ, der definiert ist, wird auf Elemente untersucht, auf die nicht zugegriffen werden kann. Die Typhierarchie wird nicht durchlaufen, um nach einer Übereinstimmung zu suchen.

Der Wert des ersten Arguments wird als this Zeiger für instance Felder und Methoden behandelt.

Das erste Argument muss als ref für instance Felder und Methoden für Strukturen übergeben werden.

Der Wert des ersten Arguments wird von der -Implementierung nicht für static Felder und Methoden verwendet und kann sein null.

Der Rückgabewert für einen Accessor auf ein Feld kann lauten ref , wenn die Einstellung des Felds gewünscht ist.

Auf Konstruktoren kann mit Constructor oder Methodzugegriffen werden.

Der Rückgabetyp wird für die Signatureinstimmung berücksichtigt. Modreqs und Modopts werden zunächst nicht für die Signatur-Übereinstimmung berücksichtigt. Wenn jedoch eine Mehrdeutigkeit besteht, die Modreqs und Modopts ignoriert, wird versucht, eine genaue Übereinstimmung zu finden. Wenn noch eine Mehrdeutigkeit vorhanden ist, AmbiguousMatchException wird ausgelöst.

Standardmäßig bestimmt der Name der attributierten Methode den Namen der Methode/des Felds. Dies kann in einigen Fällen zu Verwirrung führen, da Sprachabstraktionen wie lokale C#-Funktionen verwaltete IL-Namen generieren. Die Lösung hierfür besteht darin, den nameof Mechanismus zu verwenden und die Name -Eigenschaft zu definieren.

Konstruktoren

UnsafeAccessorAttribute(UnsafeAccessorKind)

Instanziiert einen UnsafeAccessorAttribute , der Zugriff auf ein Element der Art UnsafeAccessorKindbereitstellt.

Eigenschaften

Kind

Ruft die Art des Members ab, auf den zugriff gewährt wird.

Name

Ruft den Namen des Members ab, für das zugriff gewährt wird, oder legt diesen fest.

TypeId

Ruft bei Implementierung in einer abgeleiteten Klasse einen eindeutigen Bezeichner für dieses Attribute ab.

(Geerbt von Attribute)

Methoden

Equals(Object)

Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist.

(Geerbt von Attribute)
GetHashCode()

Gibt den Hashcode für diese Instanz zurück.

(Geerbt von Attribute)
GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
IsDefaultAttribute()

Gibt beim Überschreiben in einer abgeleiteten Klasse an, ob der Wert der Instanz der Standardwert für die abgeleitete Klasse ist.

(Geerbt von Attribute)
Match(Object)

Beim Überschreiben in einer abgeleiteten Klasse wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem bestimmten Objekt entspricht.

(Geerbt von Attribute)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für: