Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
 Аватар для kotAV
142 / 108 / 57
Регистрация: 15.09.2017
Сообщений: 425

Поиск связки PropertyInfo-object по строке

29.10.2019, 12:04. Показов 3063. Ответов 1

Студворк — интернет-сервис помощи студентам
Нужно написать алгоритм, который создаст связку PropertyInfo-object по строке.

Для проверки:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
program NS;
 
uses System.Reflection;
 
type
  TInternal = class
    public auto property Prop: integer := 333;
  end;
  
  TExternal = class
    public auto property A: TInternal := new TInternal();
  end;
  
  T = class
    public static auto property X: TExternal := new TEXternal();
  end;
  
  PropInfoAndObject = auto class
    public auto property PropInfo: PropertyInfo;
    public auto property PropObject: object;
    
    public procedure SetValue(value: object) := PropInfo.SetValue(PropObject, value);
    
    public function GetValue: object := PropInfo.GetValue(PropObject);
  end;
 
function Find(s: string): PropInfoAndObject;
begin
  // Сам алгоритм
end;
 
begin
  var prop := Find('NS.T.X.A.Prop');
  Writeln(prop.GetValue() = 333);
  prop.SetValue(444);
  Writeln(prop.GetValue() = 444);
end.
Вместо NS может быть и имя вложенного пространства, это тоже нужно предусмотреть.

Возможно, я сделаю сам и тогда выложу решение.

А так, Sun Serega, надежда на тебя!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2019, 12:04
Ответы с готовыми решениями:

(Reflection)PropertyInfo.GetValue and PropertyInfo.SetValue Methods
Доброе время суток! Собственно вопрос: Есть обьект(objA) унаследовавший свойство от интерфейса. А также есть массив(masA) формата:...

Метод First массива PropertyInfo[] работает через раз
Вот такой код: try { PropertyInfo pr = props.First( ...

'Object already exists' на строке myMail.Send()
Написал небольшой скрипт рассылающий мыло с использованием CDONTS.NewMail. Не выполняет. Тогда для теста пробую прогнать скрипт в...

1
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
29.10.2019, 12:35
Лучший ответ Сообщение было отмечено kotAV как решение

Решение

Ну наконец хотя бы ТЗ нормальное))
А последнее условие:
Pascal
1
Writeln(prop.GetValue() = 444);
Лучше заменить на:
Pascal
1
Writeln(T.X.A.Prop = 444);
Чтоб уже типа в обе стороны проверялось.

Добавлено через 24 минуты
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
program NS;
 
uses System.Reflection;
 
type
  TInternal = class
    public auto property Prop: integer := 333;
  end;
  
  TExternal = class
    public auto property A: TInternal := new TInternal();
  end;
  
  T = class
    public static auto property X: TExternal := new TEXternal();
  end;
  
  PropInfoAndObject = auto class
    public auto property PropInfo: PropertyInfo;
    public auto property PropObject: object;
    
    public procedure SetValue(value: object) := PropInfo.SetValue(PropObject, value);
    
    public function GetValue: object := PropInfo.GetValue(PropObject);
  end;
 
function Find(s: string): PropInfoAndObject;
begin
  var enmr := s.ToWords('.').Select(s->s).GetEnumerator; // без .Select почему то не даёт сделать IEnumerator<string>
  
  enmr.MoveNext;
  var tname := enmr.Current;
  var t: System.Type;
  while true do
  begin
    // можно искать и в:
    //System.AppDomain.CurrentDomain.GetAssemblies
    // но это уже сам
    t := Assembly.GetCallingAssembly.GetType(tname);
    if t<>nil then break;
    if not enmr.MoveNext then exit;
    tname := Concat(tname,'.',enmr.Current);
  end;
  
  var prop: PropertyInfo;
  while true do
  begin
    if not enmr.MoveNext then exit;
    var pname := enmr.Current;
    prop := t.GetProperty(pname, BindingFlags.Static or BindingFlags.Public or BindingFlags.NonPublic); // BindingFlags.Instance не смотрим, объекта всё равно ещё нет
    if prop<>nil then break;
    t := t.GetNestedType(pname, BindingFlags.Public or BindingFlags.NonPublic); // хз вще правильно ли без BindingFlags.Static, потести как то сам
    if t=nil then exit;
  end;
  if prop.GetIndexParameters.Any then raise new System.NotSupportedException('Индексные свойства не поддерживаются');
  
  var o: object;
  while enmr.MoveNext do
  begin
    o := prop.GetValue(o);
    prop := prop.PropertyType.GetProperty(enmr.Current, BindingFlags.Instance or BindingFlags.Static or BindingFlags.Public or BindingFlags.NonPublic);
    if prop=nil then exit;
  end;
  
  Result := new PropInfoAndObject;
  Result.PropInfo := prop;
  Result.PropObject := o;
end;
 
begin
  var prop := Find('NS.T.X.A.Prop');
  Writeln(integer(prop.GetValue()) = 333); // integer() потому что анбоксинг, иначе проверяет ссылку
  prop.SetValue(444);
  Writeln(T.X.A.Prop = 444);
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.10.2019, 12:35
Помогаю со студенческими работами здесь

Uncaught TypeError: Object [object Object] has no method
Всем привет. Я новичок в этой сфере. у меня возникла ошибка в консоли при добавлении карусели на сайт: &quot;Uncaught TypeError: Object ...

AttributeError на строке 4: 'int' object has no attribute 'count'
есть строка p = s.count('@') Пишет ошибку AttributeError на строке 4: 'int' object has no attribute 'count' что не так?

Замена строки в ListView, закрепить каждой строке object
Здравствуйте, есть такой вот ListView. &lt;ListView Name=&quot;treeView1&quot; HorizontalAlignment=&quot;Stretch&quot;...

Подсчитать количество вхождений буквы «о» в строке «прямой поиск в текстовой строке»
Подсчитать количество вхождений буквы «о» в строке «прямой поиск в текстовой строке» Заменить в вышеприведенной стоке слово «прямой» на...

Работа с массивами. Поиск наименьшего числа в строке и наибольшего в строке
Добрый вечер. Надо найти наименьшее число в строке и наибольшее в столбце. Примерно вот так должно искать. потом надо собрать новый...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru