Установить частного сеттера на собственность через отражение


Я знаю, что у этого есть несколько канонических ответов (которые я успешно использовал в прошлом!) См. https://stackoverflow.com/a/1778410/1675729 и https://stackoverflow.com/a/1565766/1675729 для справки, эти методы включают в себя использование метода SetValue на PropertyInfo свойства, или иным образом вызов метода setter с отражением, или в крайних случаях, установка резервного поля непосредственно. Однако ни один из этих методов, похоже, не работает для меня сейчас, и мне любопытно, если что-то изменилось, что нарушило эту функциональность.

Рассмотрим следующее:

using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        var exampleInstance = new Example();
        var exampleType = typeof(Example);
        var fooProperty = exampleType.GetProperty("Foo"); // this works fine - the "GetSetMethod" method returns null, however

        // fails with the following:
        // [System.MethodAccessException: Attempt by method 'Program.Main()' to access method 'Example.set_Foo(Int32)' failed.]
        //fooProperty.SetValue(exampleInstance, 24);

        // same error here:
        //Run-time exception (line 14): Attempt by method 'Program.Main()' to access method 'Example.set_Foo(Int32)' failed.
        //exampleType.InvokeMember(fooProperty.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetProperty | BindingFlags.Instance, null, exampleInstance, new object[] { 24 });
    }
}

public class Example 
{
    public int Foo { get; private set; }
}

Свойство Foo имеет сеттера, это просто частное. Он также терпит неудачу, если я изменяю сеттер на protected , что кажется еще более странным, поскольку это больше не инициализатор C#6-только сеттер. Это происходит с обоими .Net 4.5 и .Объем сердечника 2 в качестве среды выполнения. Чего мне не хватает?

1 3

1 ответ:

Такое поведение является преднамеренным. Есть несколько строгих правил, которые управляют способностью злоупотреблять рефлексией таким образом.

Доступ К Членам, Которые Обычно Недоступны

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