Как стать автором
Обновить

Комментарии 13

НЛО прилетело и опубликовало эту надпись здесь

Добавил примеры.

НЛО прилетело и опубликовало эту надпись здесь

А для enum-ов почему аттрибуты не сгенерировались? Нужны же по идее.

Упс. Мой косяк. Скопировал не из того тестового проєкта. Уже поправил.

Первый вызов конечно медленноват, но последующие будут на уровне вашего решения.

Да. Если не брать в расчет инициализацию должно быть быстро, но в теории могут быть проблемы с AOT компиляцией. Я ещё буду смотреть что и как там.

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

Думаю что намного лучше не строить АОТ рефлексию заранее

AOT рефлексия строится зарание, но не инициализируется, и только для типов для которых мы её вызываем. Сама инициализация происходит в момент первого вызова.

если быстродействия стандартной не хватает.

Этот момент не понял. Как мы можем узнать, что быстродействия не хватает на этапе компиляции? Эта информация хранится в голове разботчика и это уже его задача решать что использовать и в какой ситауции.

AOT рефлексия строится зарание, но не инициализируется, и только для типов для которых мы её вызываем. Сама инициализация происходит в момент первого вызова.

Зачем она строится заранее? Для быстрого первого вызова? Строится заранее для всех типов? Она занимает место в коде для всех типов?
Так то можно из стандартной построить, по какой то из стратегий кэширования и не будет проблем с универсальными (generic) типами.

Этот момент не понял. Как мы можем узнать, что быстродействия не хватает на этапе компиляции? Эта информация хранится в голове разботчика и это уже его задача решать что использовать и в какой ситауции.

Мы можем кэшировать, не на первый вызов, а только при многочисленных вызовах и т. д. Разработчик может выбирать стратегии кэширования и т.д.

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

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

var entries = _user.GetProperties();

А как объявлен _user? Если его тип известен, то рефлексия по сути дела не нужна, ибо результат (o is RequiredAttribute) известен на этапе компиляции. Гораздо интереснее если _user объявлен как реализация интерфейса, например

IHaveFirstName _user;
.....

Как такое работает?

Если его тип известен, то рефлексия по сути дела не нужна, ибо результат (o is RequiredAttribute) известен на этапе компиляции

Он то известен, но удобного способа им воспользоваться нет. Разве что разработчик должен сам за этим следить и вовремя подправлять.

Как такое работает?

Сейчас AOT рефлексия зависит от типов над которыми происходят манипуляции, но я уже придумал как можно сделать, так чтобы она понимала, что спрятано за интерфейсом.

НЛО прилетело и опубликовало эту надпись здесь

Я делаю нечно аналогичное в одном проекте, только вместо сорс генераторов использую Т4. Результат такой же: куча нагенеренных конструктов. А причина: вызов метода через рефлекшн, если его не кэшировать через Delegate.CreateDelegate, является непомерно дорогим удовольствием, особенно когда вызываешь итеративно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории