Como escrever um bom padrão de modelo curiosamente recorrente (CRTP) em c #

Um tempo atrás eu queria criar meu próprio mapeador de dados que seria muito mais simples do que o seu ORM médio. Ao fazer isso, descobri a necessidade de ter acesso às informações de tipo de classes herdadas em minha classe base. Meu primeiro pensamento foi reflexão, mas é muito lento (se você usar reflexão, confiraFasterflect como "quase" elimina os problemas de desempenho da reflexão).

Então eu me virei para uma solução que mais tarde descobri ter seu próprio nome: The Curiously Recurring Template Pattern. Isso resolveu principalmente o meu problema, mas aprender a implementar corretamente esse padrão foi um pouco desafiador. As duas principais questões que tive que resolver foram:

1) Como posso deixar meu código de consumo funcionar com meus objetos genéricos sem precisar conhecer os parâmetros genéricos com os quais os objetos foram criados?

2) Como posso herdar campos estáticos em c #?

A parte desafiadora foi na verdade descobrir as questões. Depois que percebi o que precisava fazer, resolver essas questões foi bem fácil. Se você estiver precisando do CRTP, provavelmente precisará responder a essas perguntas ... eles parecem andar de mãos dadas.

questionAnswers(1)

yourAnswerToTheQuestion