The final solution after much debate and optimization:
public class DynamicInitializer
{
static readonly Dictionary<string, Func<object>> list = new Dictionary<string, Func<object>>();
public static T New<T>() where T : class
{
return New(typeof (T)) as T;
}
public static object New(Type type)
{
if (list.ContainsKey(type.Name)) return list[type.Name];
Func<object> method = Expression.Lambda<Func<object>>(Expression.Block(type, new Expression[] { Expression.New(type) })).Compile();
list.Add(type.Name, method);
return method();
}
}