Хитрость в таких ситуациях заключается в использовании неуниверсального класса с универсальными методами.
public class MyType
{
public T GetResult<T>() {
}
}
Обратите внимание, что это происходит во время компиляции. Обобщения дают вам возможность создавать различные «разновидности» типа или метода во время компиляции; но генерики не динамические! Обобщения являются типобезопасными, и безопасность типов может быть достигнута только во время компиляции (поскольку компилятор проверяет безопасность типов).