skbkontur / dotEducation

База знаний для .NET разработчиков
Creative Commons Zero v1.0 Universal
227 stars 26 forks source link

Задачи для практики: рефлексия #8

Open nevoroman opened 2 years ago

nevoroman commented 2 years ago

Что мы хотим?

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

В каком виде?

Дискуссионно, но пока мне это видится как .NET проект с тестами, залитый в этот или отдельный репозиторий. Мы даем базовый API без реализации и тесты, проверяющие, что задача выполнена правильно.

Возможно, хорошо будет сюда же включить некоторые code samples, позволяющие посмотреть на правильную реализацию схожих задач — но не обязательно, материалов из репозитория должно быть достаточно.

Зачем?

Без хороших практических задачек рефлексию может быть изучать сложно и непонятно, а вот практиковаться в применении рефлексии интересно.

Что нужно?

Предложения по конкретным задачам и героические люди, готовые для этих задач написать API и тесты. С нас понятное описание для задачи, ссылки на все нужные для ее выполнения материалы любая помощь в подготовке задач.

vabka commented 2 years ago

Кстати в .NET 6 расширился API для рефлексии: https://github.com/dotnet/runtime/pull/54985

nevoroman commented 2 years ago

Кстати в .NET 6 расширился API для рефлексии: dotnet/runtime#54985

Думаю, добавим эту информацию после релиза.

koviant commented 2 years ago

Привет! Идеи для задач:

  1. Написать свой сериалайзер в JSON, который вытягивает все проперти из переданного объекта. Можно навешивать свои аттрибуты JsonName(string) или Ignore. Соответственно первый задаёт имя, которое должно быть у этого проперти в json'e, второй аттрибует означает игнорирование этого проперти.
  2. Имея уже какую-то готовую программу, добавить в неё поддержку плагинов. Вместе с основным приложением идёт интерфейс IPlugin, который содержит необходимые для плагина поля и методы. В моём конкретном случае, когда встретил такую задачу, делали расширение для wpf-приложения, интерфейс грубо был:
    public interface IPlugin
    {
    string Name { get; } // имя плагина, показываемое в менюшке
    void Start(); // запуск работы плагина
    }

    Приложение при запуске сканит специально отведённую папку на наличие в ней .dll файлов, из них загружает типы, которые наследуются от этого интерфейса, создаёт инстанс типа и складывает в свою коллекцию плагинов.

vabka commented 2 years ago

Думаю, добавим эту информацию после релиза.

Релиз наступил :) Вот ссылка на документацию: https://docs.microsoft.com/en-us/dotnet/api/system.reflection.nullabilityinfocontext?view=net-6.0

Правда кмк, перед этим материалом следует ещё узнать про nullable reference types.