If you're fine with making Base a generic class, this is how:
abstract class Base<T> { public abstract void Method(T args); } class Derived : Base<int> { public override void Method(int args) {} } class AnotherBaseClass<T, E> where E : Base<T> { E e; T t; public void Func() { e.Method(t); } } If you need Base to not be generic, you can add this:
abstract class Base { public void Method<T>(T args) { var genericSelf = this as Base<T>; genericSelf.Method(args); } } and make Base<T> inherit Base and ensure your concrete classes always derive Base<T> and never Base directly.