Резюме
Есть два основных варианта. Лучше и новее использовать дженерики, а другое - рефлексию. Я предоставляю и то, и другое на тот случай, если вам нужно разработать решение, работающее до .NET 2.0.
Дженерики
abstract class BaseClass
{
public static BaseClass Create<T>() where T : BaseClass, new()
{
return new T();
}
}
Где будет использоваться:
DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();
Отражение
abstract class BaseClass
{
public static BaseClass Create(Type derivedType)
{
// Cast will throw at runtime if the created class
// doesn't derive from BaseClass.
return (BaseClass)Activator.CreateInstance(derivedType);
}
}
Где будет использование (разбить на две строки для удобства чтения):
DerivedClass derivedClass
= (DerivedClass)BaseClass.Create(typeof(DerivedClass));