Start Debugging

C# Доступ к backing field приватного свойства с помощью Unsafe Accessor

Используйте UnsafeAccessorAttribute в .NET 8 для доступа к автоматически генерируемым backing field приватных авто-свойств в C# без рефлексии.

Менее известная возможность UnsafeAccessorAttribute заключается в том, что он также позволяет обращаться к автоматически генерируемым backing field авто-свойств, то есть к полям с непроизносимыми именами.

Способ доступа к ним очень похож на доступ к обычным полям, отличается лишь шаблон имени члена, который выглядит так:

<MyProperty>k__BackingField

Возьмём в качестве примера следующий класс:

class Foo
{
    private string InstanceProperty { get; set; } = "instance-property";
}

Ниже приведён unsafe accessor для backing field этого свойства, а также примеры того, как прочитать приватное backing field и как изменить его значение.

[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "<InstanceProperty>k__BackingField")]
extern static ref string InstancePropertyBackingField(Foo @this);

var instance = new Foo();

// Read
_ = InstancePropertyBackingField(instance);

// Modify
InstancePropertyBackingField(instance) = Guid.NewGuid().ToString();

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад