Переопределение внутреннего свойства get-only из базового класса - PullRequest
0 голосов
/ 02 июля 2018

У меня есть этот класс, определенный в одной из сборок .NET Framework:

public class ExternalClass
{    
   internal double DesiredProperty => 1.0;    
}

Я являюсь производным от ExternalClass и хотел бы переопределить или каким-либо образом перехватить вызовы этого свойства. Я знаю, что это может быть очень забавно, но на самом деле это только для проверки концепции.

Я попробовал прямой путь с отражением, но мне не повезло:

 private void DoEvilStuff()
    {
        var prop = typeof(ExternalClass).GetProperty("DesiredProperty", BindingFlags.Instance | BindingFlags.NonPublic);

        // Exception: Property has no setter
        prop.SetValue(this, 5);
    }

С другой ответ:

private void DoEvilStuff()
{
    var prop = typeof(ExternalClass).GetField("<DesiredProperty>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic);

    // fails, prop is null:
    prop.SetValue(this, 5);
}

Есть ли способ сделать это с помощью рефлексии или каким-либо другим способом с разумными небольшими усилиями? Я могу (должным образом) обойти это для моей реальной проблемы, поэтому «Нет» - действительно приемлемый ответ, но мне любопытно, возможно ли это.

1 Ответ

0 голосов
/ 02 июля 2018
internal double DesiredProperty => 1.0;

Объявляет, что свойство имеет тело лямбда-выражения . Это компилируется в метод , который всегда возвращает 1.0. Вы не можете изменить значение, которое будет возвращать этот метод, поскольку оно не будет храниться где-либо за пределами IL этого метода. Не существует «вспомогательного поля», которое, похоже, ищет ваш второй пример кода.

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

.method assembly hidebysig specialname instance float64 get_DesiredProperty() cil managed
{
    .maxstack 8
    L_0000: ldc.r8 1
    L_0009: ret 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...