In Delphi you can define a meta class and pass classes into methods.
TFoo = class(TObject);
TFooClass = class of TFoo;
function MakeFoo( aFooClass : TFooClass ) : TFoo;
begin
result := aFooClass.Create();
end;
This allows very generic code where you can get away with just passing in a class name.
I use this heavily in Delphi as part of a test framework (the meta class represents test data).
I think that this can be done in C# using reflection but there should be a cleaner method.