using System; using System.Reflection; class Base { public static Base Create(int args) { Console.WriteLine("Creating Base with args = {0}", args); return new Base(); } } class Utility { public static Base Create(string name, int args) { var type = typeof(Utility).Module.GetType(name); return Create(type, args); } public static Base Create(Type type, int args) { var method = type.GetMethod("Create", BindingFlags.Public|BindingFlags.Static); return method.Invoke(null, new object[]{args}) as Base; } } class Derived: Base { new public static Base Create(int args) { if (args <= 0) { return Utility.Create(typeof(Derived).BaseType, args); } else { Console.WriteLine("Creating Derived with args = {0}", args); return new Derived() as Base; } } } public class Test { public static void Main() { Utility.Create("Base", 1234); Utility.Create("Derived", 0); Utility.Create("Derived", 1); } }