using System; using System.Reflection; namespace UniJSON { struct GenericConstructor where T : IListTreeItem, IValue { static V[] ArrayCreator(ListTreeNode src) { if (!src.IsArray()) { throw new ArgumentException("value is not array"); } var count = src.GetArrayCount(); return new V[count]; } static Func, U> GetCreator() { var t = typeof(U); if (t.IsArray) { var mi = typeof(GenericConstructor).GetMethod("ArrayCreator", BindingFlags.NonPublic | BindingFlags.Static); var g = mi.MakeGenericMethod(t.GetElementType()); return GenericInvokeCallFactory.StaticFunc, U>(g); } { return _s => { return Activator.CreateInstance(); }; } } delegate U Creator(ListTreeNode src); static Creator s_creator; public U Create(ListTreeNode src) { if (s_creator == null) { var d = GetCreator(); s_creator = new Creator(d); } return s_creator(src); } } }