public class Item : IItem
public string id{get;set;}
public DelegateHolder.MakeWithID funcA;
public DelegateHolder.MakeWithIDAndOther funcB;
public class TypedFactory<T> : BaseFactory
funcB = makeNewFromOther;
public T makeNew(string itemId)
public T makeNewFromOther(string itemId, T other)
public class DelegateHolder
public delegate IItem MakeWithID(string id);
public delegate IItem MakeWithIDAndOther(string id, IItem other);
public static void Main()
var x = new TypedFactory<Item>();
IItem someItem = factory.funcA("I am alive");
Console.WriteLine(someItem.id);
Console.WriteLine(factory.funcB("I am alive too", someItem).id);