Решением, которое я использовал, было создание класса расширения:
public static class myExtensionClass
{
public void doSomething<T>(List<BaseClass> bc) where T: BaseClass
{
// do something with bc
}
}
Он использует общий, но когда вы его вызываете, вам не нужно выделять класс, поскольку вы уже «сказали» компилятор тип тот же самый из расширенного класса.
Вы бы назвали его следующим образом:
List<DerivedClass> lst = new List<DerivedClass>();
lst.doSomething();