UnsafeAccessorAttribute Класс

Определение

Предоставляет доступ к недоступному члену определенного типа.

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
Наследование
UnsafeAccessorAttribute
Атрибуты

Примеры

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

Комментарии

Этот атрибут можно применить к методу extern static . Реализация метода, extern static помеченного этим атрибутом, будет предоставляться средой выполнения на основе сведений в атрибуте и сигнатуры метода, к которому применяется атрибут. Среда выполнения попытается найти соответствующий метод или поле и перенаправит на него вызов. Если соответствующий метод или поле не найдены, тело extern static метода вызовет MissingFieldException или MissingMethodException.

Универсальные параметры поддерживаются начиная с .NET 9. Универсальные параметры должны соответствовать целевому объекту по форме и индексу (то есть параметры типа должны быть параметрами типа, а параметры метода — параметрами метода). Универсальные extern static параметры метода также должны точно соответствовать любым ограничениям, отраженным в целевом объекте. Если ограничения не совпадают, метод выдает исключение InvalidProgramException.

Для Method, StaticMethod, Fieldи StaticFieldтип первого аргумента аннотированного extern static метода определяет тип-владение. На наличие недоступных элементов будет проверяться только определенный определенный тип. Иерархия типов не просматривается в поисках соответствия.

Значение первого аргумента обрабатывается как this указатель для полей и методов экземпляра.

Первый аргумент должен передаваться как ref для полей и методов экземпляра в структуре.

Значение первого аргумента не используется реализацией для static полей и методов и может иметь значение null.

Возвращаемое значение метода доступа к полю может иметь значение ref , если требуется настройка поля.

Доступ к конструкторам можно получить с помощью Constructor или Method.

Тип возвращаемого значения считается для соответствия сигнатуры. Modreqs и modopts изначально не учитываются для совпадения сигнатур. Однако если существует неоднозначность, игнорирующая modreqs и modopts, предпринимается попытка точного совпадения. Если неоднозначность все еще существует, AmbiguousMatchException возникает исключение .

По умолчанию имя метода с атрибутами определяет имя метода или поля. В некоторых случаях это может привести к путанице, так как абстракции языка, такие как локальные функции C#, создают искаженные имена IL. Решением этой проблемы является использование nameof механизма и определение Name свойства .

Конструкторы

UnsafeAccessorAttribute(UnsafeAccessorKind)

Создает экземпляр , предоставляющий UnsafeAccessorAttribute доступ к члену типа UnsafeAccessorKind.

Свойства

Kind

Возвращает тип элемента, к которому предоставляется доступ.

Name

Возвращает или задает имя члена, которому предоставляется доступ.

TypeId

В случае реализации в производном классе возвращает уникальный идентификатор для этого атрибута Attribute.

(Унаследовано от Attribute)

Методы

Equals(Object)

Возвращает значение, показывающее, равен ли экземпляр указанному объекту.

(Унаследовано от Attribute)
GetHashCode()

Возвращает хэш-код данного экземпляра.

(Унаследовано от Attribute)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
IsDefaultAttribute()

При переопределении в производном классе указывает, является ли значение этого экземпляра значением по умолчанию для производного класса.

(Унаследовано от Attribute)
Match(Object)

При переопределении в производном классе возвращает значение, указывающее, является ли этот экземпляр равным заданному объекту.

(Унаследовано от Attribute)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к