object CreateSimpleLoader(SimpleLoaderType loaderType) { var delegateType = typeof(Func <, ,>).MakeGenericType(typeof(AbstractBufferedReader), typeof(IReaderCtx), loaderType.RealType); var dm = ILBuilder.Instance.NewMethod(loaderType.FieldHandler.Name + "SimpleReader", delegateType); var ilGenerator = dm.Generator; Action <IILGen> pushReaderOrCtx = il => il.Ldarg((ushort)(loaderType.FieldHandler.NeedsCtx() ? 1 : 0)); loaderType.FieldHandler.Load(ilGenerator, pushReaderOrCtx); ilGenerator .Do(_typeConvertorGenerator.GenerateConversion(loaderType.FieldHandler.HandledType(), loaderType.RealType)) .Ret(); return(dm.Create()); }
public object GetSimpleLoader(SimpleLoaderType handler) { return(_simpleLoader.GetOrAdd(handler, CreateSimpleLoader)); }