Teilen über


UnsafeAccessorAttribute Klasse

Definition

Bietet Zugriff auf ein nicht zugängliches Element 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 mit diesem Attribut kommentierten extern static-Methode wird von der Laufzeit basierend auf den Informationen im Attribut und der Signatur der Methode bereitgestellt, auf die das Attribut angewendet wird. Die Laufzeit versucht, die entsprechende Methode oder das entsprechende Feld zu finden und den Aufruf weiterzuleiten. Wenn die übereinstimmende Methode oder das entsprechende Feld nicht gefunden wird, löst der Textkörper der extern static-Methode MissingFieldException oder MissingMethodExceptionaus.

Generische Parameter werden seit .NET 9 unterstützt. Generische Parameter müssen dem Ziel im Formular und Index entsprechen (d. a. Typparameter müssen Typparameter sein und Methodenparameter müssen Methodenparameter sein). Die generischen Parameter der extern static Methode müssen auch genau mit allen Einschränkungen übereinstimmen, die auf das Ziel angewendet werden. Wenn Einschränkungen nicht übereinstimmen, löst die Methode InvalidProgramExceptionaus.

Bei Method, StaticMethod, Fieldund StaticFieldidentifiziert der Typ des ersten Arguments der kommentierten extern static -Methode den besitzereigenen Typ. Nur der definierte spezifische Typ wird auf nicht zugängliche Member untersucht. Die Typhierarchie wird nicht nach einer Übereinstimmung gesucht.

Der Wert des ersten Arguments wird als this Zeiger behandelt, z. B. Felder und Methoden.

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

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

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

Auf Konstruktoren kann über Constructor oder Methodzugegriffen werden.

Eine Übereinstimmung wird bestimmt, indem Metadatensignaturen verglichen werden, wie in Abschnitt II.23.2 von ECMA-335definiert. Der Rückgabetyp wird für die Signatur-Übereinstimmung berücksichtigt. Modreqs und Modopts werden zunächst nicht für die Signatur-Übereinstimmung berücksichtigt. Wenn jedoch eine Mehrdeutigkeit vorhanden ist, die Modreqs und Modopts ignoriert, wird versucht, eine genaue Übereinstimmung zu versuchen. Wenn noch eine Mehrdeutigkeit vorhanden ist, wird AmbiguousMatchException 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 gehandhabte 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 eine UnsafeAccessorAttribute, die Zugriff auf ein Mitglied UnsafeAccessorKindermöglicht.

Eigenschaften

Kind

Ruft die Art des Mitglieds ab, auf das der Zugriff bereitgestellt wird.

Name

Ruft den Namen des Elements ab, auf das der Zugriff bereitgestellt wird, oder legt diesen fest.

TypeId

Wenn sie in einer abgeleiteten Klasse implementiert wird, wird ein eindeutiger Bezeichner für diese Attribute.

(Geerbt von Attribute)

Methoden

Equals(Object)

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

(Geerbt von Attribute)
GetHashCode()

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

(Geerbt von Attribute)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
IsDefaultAttribute()

Wenn sie in einer abgeleiteten Klasse überschrieben wird, gibt an, ob der Wert dieser Instanz der Standardwert für die abgeleitete Klasse ist.

(Geerbt von Attribute)
Match(Object)

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem angegebenen Objekt entspricht.

(Geerbt von Attribute)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
ToString()

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

(Geerbt von Object)

Gilt für: