Некоторое время назад я хотел создать свой собственный преобразователь данных, который был бы намного проще, чем ваш обычный ORM. При этом я обнаружил необходимость иметь доступ к информации о типах наследуемых классов в моем базовом классе. Моей первой мыслью было отражение, но оно слишком медленное (хотя, если вы используете отражение, посмотрите Fasterflect, так как оно «почти» устраняет проблемы с производительностью, связанные с отражением).
Поэтому я обратился к решению, которое, как я позже узнал, имело собственное название: любопытно повторяющийся шаблон шаблона. Это в основном решило мою проблему, но научиться правильно реализовывать этот шаблон было немного сложно. Мне предстояло решить два основных вопроса:
1) Как я могу позволить моему потребляющему коду работать с моими универсальными объектами без необходимости знать универсальные параметры, с которыми эти объекты были созданы?
2) Как я могу наследовать статические поля в C#?
Сложнее всего было разобраться в вопросах. Как только я понял, что мне нужно сделать, решить эти вопросы было довольно легко. Если вы обнаружите, что нуждаетесь в CRTP, вам, вероятно, придется ответить на эти вопросы... кажется, что они идут рука об руку.