Лінощі, рефлексія, атрибути, динамічні зборки

Невеликий досвід, отриманий завдяки лінощі

Років зо три тому, працював я на одну фірму. Було нас 4 програмісти. Один писав бізнес логіки програми. Описував її за допомогою інтерфейсів (interface). Логічні зв'язки, залежності і т. д. Наше завдання було реалізувати ці інтерфейси і пов'язати з GUI. Основною проблемою у цій системі були постійні зміни структури зв'язків та параметрів. Тобто нам доводилося постійно займатися правкою та рефакторингом.

Я людина досить лінива. Тому прийшла думка — невже не можна, як це автоматизувати. І я сів за книжки.

Перша ідея була достатньо явна і проста. Інтерфейси містяться в окремих файлах — тож чому б не розпарсувати їх і створити текстовий файл зі згенерованим класом. Так було зроблено.

Начебто проблема вирішена. Але роботи ще багато залишалося: перенесення файлів, рефакторинг. Та ще у хлопців нічого не змінилося. Вони займалися створенням UI та прив'язкою його до об'єктної моделі.

Продовжуючи пошуки в мережі я натрапив на опис класу Type, зацікавившись, я почитав про нього докладніше. Є багато цікавих функцій цього класу. Фактично завдяки йому можна отримати всю інформацію по класу. Конструктор, реалізовані інтерфейси, характеристики, змінні, функції ... Повну інформацію. І я почав експериментувати з ним, і в результаті отримав:

То був прорив. Було створено обгортку, яка займалася біндингом даних до GUI за тестовими структурами. Швидкість розробки значно збільшилась. В принципі, можна було б заспокоїтися.Але ж я лінивий.

Клас ILGeneratorВдома, почитавши інформацію з цього класу, я зрозумів — це воно.

Кручу-верчу, що хочу те і ворочу

Зібравши в купу всюінформацію, я приступив до справи.

Трохи почухавши ріпу, я створив клас з генерації динамічних об'єктів на базі переданих: базового класу (будь-якого) і списку інтерфейсів:

Трохи опишу проект

Формування властивостей об'єкта:

З поточних можливостей:

Формування динамічних класів-об'єктів на базі переданих: базового класу та списку інтерфейсів, можливість зберегти ці об'єкти в окрему бібліотеку(dll), через BuilderClassesPropertyAttribyte спадкоємця Attribute можна ставити у вбудованих параметрів-об'єктів різне успадкування та поведінку. Формування та ініціалізація об'єктів-класів проводитися з безліччю вкладених об'єктів.

Планую в майбутньому:

Дати можливість формувати об'єкти від декількох класів та інтерфейсів. Дуже мені вже не вистачало після цього С++.

А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»