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);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKCmNsYXNzIEJhc2UKewoJcHVibGljIHN0YXRpYyBCYXNlIENyZWF0ZShpbnQgYXJncykKCXsKCQlDb25zb2xlLldyaXRlTGluZSgiQ3JlYXRpbmcgQmFzZSB3aXRoIGFyZ3MgPSB7MH0iLCBhcmdzKTsKCQlyZXR1cm4gbmV3IEJhc2UoKTsKCX0KfQoKY2xhc3MgVXRpbGl0eQp7CglwdWJsaWMgc3RhdGljIEJhc2UgQ3JlYXRlKHN0cmluZyBuYW1lLCBpbnQgYXJncykKCXsKCQl2YXIgdHlwZSA9IHR5cGVvZihVdGlsaXR5KS5Nb2R1bGUuR2V0VHlwZShuYW1lKTsKCQlyZXR1cm4gQ3JlYXRlKHR5cGUsIGFyZ3MpOwoJfQoJCglwdWJsaWMgc3RhdGljIEJhc2UgQ3JlYXRlKFR5cGUgdHlwZSwgaW50IGFyZ3MpCgl7CgkJdmFyIG1ldGhvZCA9IHR5cGUuR2V0TWV0aG9kKCJDcmVhdGUiLCBCaW5kaW5nRmxhZ3MuUHVibGljfEJpbmRpbmdGbGFncy5TdGF0aWMpOwoJCXJldHVybiBtZXRob2QuSW52b2tlKG51bGwsIG5ldyBvYmplY3RbXXthcmdzfSkgYXMgQmFzZTsKCX0KfQoKY2xhc3MgRGVyaXZlZDogQmFzZQp7CgluZXcgcHVibGljIHN0YXRpYyBCYXNlIENyZWF0ZShpbnQgYXJncykKCXsKCQlpZiAoYXJncyA8PSAwKQoJCXsKCQkJcmV0dXJuIFV0aWxpdHkuQ3JlYXRlKHR5cGVvZihEZXJpdmVkKS5CYXNlVHlwZSwgYXJncyk7CgkJfQoJCWVsc2UKCQl7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCJDcmVhdGluZyBEZXJpdmVkIHdpdGggYXJncyA9IHswfSIsIGFyZ3MpOwoJCQlyZXR1cm4gbmV3IERlcml2ZWQoKSBhcyBCYXNlOwoJCX0KCX0KfQoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCVV0aWxpdHkuQ3JlYXRlKCJCYXNlIiwgMTIzNCk7CgkJVXRpbGl0eS5DcmVhdGUoIkRlcml2ZWQiLCAwKTsKCQlVdGlsaXR5LkNyZWF0ZSgiRGVyaXZlZCIsIDEpOwoJfQp9