public static TypeDescription GetForUse(bool flatten) { if (Sealed != null && !flatten) { return(Sealed); } if (Sealed == null) { lock (GetForUseLock) { if (Sealed != null && !flatten) { return(Sealed); } var ret = Get(); Action postPromise; ret = ret.DePromise(out postPromise); postPromise(); ret.Seal(); Sealed = ret; } } if (!flatten) { return(Sealed); } if (Flattened != null) { return(Flattened); } lock (GetForUseLock) { if (Flattened != null) { return(Flattened); } var ret = Sealed.Clone(new Dictionary <TypeDescription, TypeDescription>()); Flattener.Flatten(ret, Config.GetIdProvider()); if (!ret.NeedsMapping) { ret.TypeModel = TypeModelBuilder.BuildTypeModel(ret); ret.TypeModel.CompileInPlace(); } Flattened = ret; return(Flattened); } }