UnsafeAccessorAttribute Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Ger åtkomst till en otillgänglig medlem av en viss typ.
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
- Arv
- Attribut
Exempel
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());
}
Kommentarer
Du kan använda det här attributet på en extern static metod. Implementeringen av metoden extern static som kommenterats med det här attributet tillhandahålls av körningen baserat på informationen i attributet och signaturen för den metod som attributet tillämpas på. Körningen försöker hitta matchande metod eller fält och vidarebefordra anropet till den. Om matchningsmetoden eller fältet inte hittas genererar MissingFieldException metodens extern static brödtext eller MissingMethodException.
Allmänna parametrar stöds sedan .NET 9. Allmänna parametrar måste matcha målet i form och index (det vill: typparametrar måste vara typparametrar och metodparametrar måste vara metodparametrar). Metodens extern static allmänna parametrar måste också exakt matcha eventuella begränsningar som återspeglas i målet. Om begränsningarna inte matchar genererar InvalidProgramExceptionmetoden .
För Method, StaticMethod, Fieldoch StaticField, identifierar typen av det första argumentet i den kommenterade extern static metoden ägandetypen. Endast den specifika typ som definierats kommer att undersökas för otillgängliga medlemmar. Typhierarkin har inte gått för att söka efter en matchning.
Värdet för det första argumentet behandlas som this pekare för instansfält och -metoder.
Det första argumentet måste skickas som ref för instansfält och metoder på structs.
Värdet för det första argumentet används inte av implementeringen för static fält och metoder och kan vara null.
Returvärdet för en accessor till ett fält måste skickas som ref.
Konstruktorer kan nås med eller ConstructorMethod.
En matchning bestäms genom att metadatasignaturer jämförs enligt definitionen i avsnitt II.23.2 i ECMA-335. Returtypen beaktas för signaturmatchningen. Modreqs och modopts beaktas ursprungligen inte för signaturmatchningen. Men om det finns en tvetydighet som ignorerar modreqs och modopts, görs ett exakt matchningsförsök. Om det fortfarande finns en tvetydighet utlöses AmbiguousMatchException .
Som standard dikterar den tillskrivna metodens namn namnet på metoden/fältet. Detta kan orsaka förvirring i vissa fall eftersom språkabstraktioner, till exempel lokala C#-funktioner, genererar manglade IL-namn. Lösningen på detta är att använda mekanismen nameof och definiera egenskapen Name .
Konstruktorer
| Name | Description |
|---|---|
| UnsafeAccessorAttribute(UnsafeAccessorKind) |
Instansierar en UnsafeAccessorAttribute som ger åtkomst till en medlem av typen UnsafeAccessorKind. |
Egenskaper
| Name | Description |
|---|---|
| Kind |
Hämtar den typ av medlem som åtkomst tillhandahålls till. |
| Name |
Hämtar eller anger namnet på den medlem som åtkomst tillhandahålls till. |
| TypeId |
När den implementeras i en härledd klass hämtar du en unik identifierare för den här Attribute. (Ärvd från Attribute) |
Metoder
| Name | Description |
|---|---|
| Equals(Object) |
Returnerar ett värde som anger om den här instansen är lika med ett angivet objekt. (Ärvd från Attribute) |
| GetHashCode() |
Returnerar hash-koden för den här instansen. (Ärvd från Attribute) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| IsDefaultAttribute() |
När den åsidosättas i en härledd klass anger du om värdet för den här instansen är standardvärdet för den härledda klassen. (Ärvd från Attribute) |
| Match(Object) |
När den åsidosätts i en härledd klass returneras ett värde som anger om den här instansen är lika med ett angivet objekt. (Ärvd från Attribute) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |