Как написать хороший любопытно повторяющийся шаблон шаблона (CRTP) на C#

Некоторое время назад я хотел создать свой собственный преобразователь данных, который был бы намного проще, чем ваш обычный ORM. При этом я обнаружил необходимость иметь доступ к информации о типах наследуемых классов в моем базовом классе. Моей первой мыслью было отражение, но оно слишком медленное (хотя, если вы используете отражение, посмотрите Fasterflect, так как оно «почти» устраняет проблемы с производительностью, связанные с отражением).

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

1) Как я могу позволить моему потребляющему коду работать с моими универсальными объектами без необходимости знать универсальные параметры, с которыми эти объекты были созданы?

2) Как я могу наследовать статические поля в C#?

Сложнее всего было разобраться в вопросах. Как только я понял, что мне нужно сделать, решить эти вопросы было довольно легко. Если вы обнаружите, что нуждаетесь в CRTP, вам, вероятно, придется ответить на эти вопросы... кажется, что они идут рука об руку.

10
задан spender 7 June 2012 в 21:15
поделиться