Необходимо использовать указатель или ссылку, поскольку надлежащий тип не известен в это время, компилятор не может инстанцировать его.
Вместо этого попытка:
void action(const typename Subclass::mytype &var) {
(static_cast<Subclass*>(this))->do_action();
}
Вы можете использовать:
System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles);
, чтобы получить папку программных файлов на машине. Это вернет все, что правильно для запущенного приложения. Поэтому для 32-разрядных приложений на 64-разрядной машине он вернет «C: \ Program Files (x86)» в английской версии Windows.