Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
271 / 238 / 102
Регистрация: 26.10.2012
Сообщений: 727
1

Как пробиться через рефлексию к закрытым методам get, set для авто-свойства?

18.05.2016, 16:14. Показов 1554. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

Как пробиться через рефлексию к закрытым методам get, set для авто-свойства?
Если стучусь к такому свойству
C#
1
public int MyInt{get; set}
то задать его значение получается.
Для такого свойства
C#
1
public int MyInt{get; private set}
задать его значение через рефлексию уже не получается. SetValue вызывает исключение, GetSetMethod(true) возвращает null. Как изменить значение такого свойства?
Может есть какой-то хук не через рефлексию, или через рефлексию левых автосгенерированных полей?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2016, 16:14
Ответы с готовыми решениями:

Выполнить команду в set свойства для свойства SelectedItem (ComboBox ) MVVM
Хай Коротко: при каждом выборе элемента из ComboBox нужно выполнять команду, для которой в...

Вывод через свойства get; set; из бд
Привет всем извините за глупый вопрос тут проблема после авторизации происходит автоматическая...

Как получить тело метода через рефлексию?
Скажите, а можно используя рефлексию вытащить тело метода в читабельном виде?

Как получить элемент списка через рефлексию?
Добрый день, уважаемые гуру. List<int> v = new List<int>(); v.Add(10); v.Add(20); v.Add(30);...

9
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
18.05.2016, 16:38 2
jetyb, ты уверен что set точно есть? Потому что GetSetMethod(true) работает без проблем
C#
1
2
3
4
5
6
7
8
9
10
11
Test t = new Test();
Console.WriteLine(t.MyInt); // 0
typeof(Test).GetProperty("MyInt")
    .GetSetMethod(true)
    .Invoke(t, new object[]{100});
Console.WriteLine(t.MyInt); // 100
// ...
class Test
{
    public int MyInt{get; private set;}
}
0
271 / 238 / 102
Регистрация: 26.10.2012
Сообщений: 727
19.05.2016, 09:59  [ТС] 3
OwenGlendower, уверен, несколько раз проверил и охреневаю
Пример вашего типа у меня также обнаруживает set method.

У меня несколько другая (вроде только по виду, а не по сути) ситуация.
Есть базовая библиотека A с абстракным классом BrakeSystem. Есть другая отдельная библиотека B, со ссылкой на базовую и классом BrakeSystem2ES10 - наследником класса базовой. Та библиотека скомпилирована в dll-ку. В базовой библиотеке через Assembly.Load (библиотека B не подключена) загружается эта библиотека B и создается рефлекшном объект типа BrakeSystem2ES10.

Что у меня наблюдается: у типа BrakeSystem2ES10 свойство базового класса BrakeValve395 не имеет в рефлекшне метода Set. Проверил несколько раз.
Что любопытно: собственное свойство SomeProperty класса BrakeSystem2ES10 через рефлекшн имеет set метод.
У класса BrakeSystem свойство BrakeSystem2ES10 также имеет set метод.
Какие-то взглюки из-за наследования?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Assembly A
public abstract class BrakeSystem
{
      public BrakeValve395 BrakeValve395 { get; private set; }
}
 
//Assembly B
public class BrakeSystem2ES10 : BrakeSystem{
      public double SomeProperty{get; private set}
}
 
//Assembly A
void MyCodeInBrakeSystemAssembly()
{
      BrakeSystem brakeSystem; // = someth
      var brakeSystemES10Type = brakeSystem.GetType(); // = BrakeSystemES10
      var propty = brakeSystemES10Type.GetProperty("BrakeValve395");
      //brakeSystemES10Type.CanWrite = false;
      //brakeSystemES10Type.GetSetMethod(true) = null
 
      //brakeSystemES10Type.GetProperty("SomeProperty).CanWrite = true
 
     //typeof(BrakeSystem).GetProperty("BrakeValve395").CanWrite = true
}
Еще замечу, что класс BrakeSystem2ES10 не имеет соименных перегруженных свойств с именем BrakeValve395.

Добавлено через 24 минуты
хм то есть brakeSystemES10Type.GetProperty("BrakeValve395")!=brakeSystemES10Type.BaseType.G etProperty("BrakeValve395")

Добавлено через 22 минуты
Итак, проблема не в загружаемых сборках. Проблема в том, что PropertyInfo базового и наследуемого классов разные по инстансу и содержанию. Решил таким костылем: использую вместо type.GetProperties
C#
1
2
3
4
5
6
7
IEnumerable<PropertyInfo> GetProperties(Type type) {
            while (true) {
                foreach (var propertyInfo in type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)) yield return propertyInfo;
                if (type.BaseType == null) yield break;
                type = type.BaseType;
            }
        }
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.05.2016, 13:38 4
jetyb, скинь файл скомпилированный.
0
271 / 238 / 102
Регистрация: 26.10.2012
Сообщений: 727
19.05.2016, 14:02  [ТС] 5
Зачем? проблема в этом
C#
1
2
3
4
5
6
7
class A {
     public int S { get; private set; }
}
class B : A { }
 
var b1 = typeof(A).GetProperty("S").CanWrite;//true
var b2 = typeof(B).GetProperty("S").CanWrite;//false
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.05.2016, 15:20 6
jetyb, http://ideone.com/wwa47i
Успешно time: 0.04 memory: 23952 signal:0

True
True
0
271 / 238 / 102
Регистрация: 26.10.2012
Сообщений: 727
19.05.2016, 15:52  [ТС] 7
Psilon, у меня пустой проект и опять же обратный результат
Вложения
Тип файла: rar ConsoleApplication2.rar (2.8 Кб, 5 просмотров)
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.05.2016, 16:10 8
jetyb, ну так CanWrite показывает, что объект этого типа может писать Меняем private на protected, и получаем true, потому что наследник имеет доступ к protected-переменным

То есть CanWrite говорит, может ли переменная типа Т записать в переменную Х. В данном случае А может записать, а B уже не может. Такой результат свойство и возвращает.
0
271 / 238 / 102
Регистрация: 26.10.2012
Сообщений: 727
19.05.2016, 16:20  [ТС] 9
Psilon, я о таком обходе догадался
правда есть у него и недостатки:
-ради собственного хука с рефлексией мне приходится менять архитектуру класса, который и писал-то не я (private set там может вполне подходить)
-проект большой, таких вот автосвойств в коде очень много и еще много может появиться. Как мне менять их все?

возможно разная работа кода на разных машинах проявляется из-за разных версий языка или фреймворка,
но поменять фрейворк проекта существующего на куче машин не так то просто
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.05.2016, 17:16 10
jetyb, CanWrite не имеет ничего общего с возможностью записывать в переменную. CanWrite может быть false, но через рефлексию значение засунуть все равно можно же.
0
19.05.2016, 17:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2016, 17:16
Помогаю со студенческими работами здесь

Как работают свойства get set? F5 и F11 - один код, разные результаты!
В общем ситуация следующая - создаю два интовых свойства, и в get проверяю на равенство get {if...

Как использовать рефлексию для уточнения значения параметра метода?
Доброго всем времени суток форумчане Помогите пож возможно кто-то знает Допустим есть метод ...

Запретить доступ к методам свойства
Здравствуйте! Есть такой код, public class B { public void Foo() {} }

Как через цикл foreach перебрать все свойства LineCap для пера?
Pen myPen = new Pen(Color.Blue,10); int i ; foreach (LineCap ff in...

Создание объектов через рефлексию
Здрасти. Ситуация такая: у меня есть супер-класс Parent и несколько подклассов Child1, Child2 и...

Получить список инстансов через рефлексию
Добрый вечер, подскажите пжл, как получить список всех инстансов (объектов) которые реализуют...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru