private static void ctx_TokenResolveEvent(object sender, TokenResolveArgs e) { var module = e.Module; var token = e.Token; switch (e.ResolveKind) { case TokenResolveArgs.ResolveKinds.String: e.ResolvedString = module.ResolveString(token); break; case TokenResolveArgs.ResolveKinds.Signature: e.ResolvedSignature = module.ResolveSignature(token); break; case TokenResolveArgs.ResolveKinds.Member: e.ResolvedMember = module.ResolveMember(token, e.TypeGenericArguments, e.MethodGenericArguments); break; } }
private static Func <Int32, ILResolveKind, Object> TokenResolverFromArgs(CILReflectionContextImpl ctx, MethodBodyLoadArgs args) { var module = new Lazy <System.Reflection.Module>(() => ctx.LaunchTypeModuleLoadEvent(new TypeModuleEventArgs(args.Method.DeclaringType)), System.Threading.LazyThreadSafetyMode.ExecutionAndPublication); var dType = args.Method.DeclaringType; var gArgs = dType #if WINDOWS_PHONE_APP .GetTypeInfo() #endif .IsGenericType ? dType.GetGenericTypeDefinition().GetGenericArguments() : null; var mgArgs = args.Method is System.Reflection.MethodInfo && args.Method.GetGenericArguments().Any() ? ((System.Reflection.MethodInfo)args.Method).GetGenericMethodDefinition().GetGenericArguments() : null; return((token, rKind) => { var tArgs = new TokenResolveArgs(module.Value, token, rKind == ILResolveKind.String ? TokenResolveArgs.ResolveKinds.String : (rKind == ILResolveKind.Signature ? TokenResolveArgs.ResolveKinds.Signature : TokenResolveArgs.ResolveKinds.Member), gArgs, mgArgs); ctx.LaunchTokenResolveEvent(tArgs); switch (rKind) { case ILResolveKind.String: return tArgs.ResolvedString; case ILResolveKind.Signature: // TODO basically same thing as in ModuleReadingContext, except use this method to resolve tokens. // Maybe could make static methods to ModuleReadingContext (ReadFieldSignature, ReadMethodSignature, ReadType) that would use callbacks to resolve tokens. throw new NotImplementedException("Implement creating method signature + var args from byte array (at this point)."); default: return tArgs.ResolvedMember is Type? ctx.Cache.GetOrAdd((Type)tArgs.ResolvedMember) : (tArgs.ResolvedMember is System.Reflection.FieldInfo ? ctx.Cache.GetOrAdd((System.Reflection.FieldInfo)tArgs.ResolvedMember) : (tArgs.ResolvedMember is System.Reflection.MethodInfo ? (Object)ctx.Cache.GetOrAdd((System.Reflection.MethodInfo)tArgs.ResolvedMember) : ctx.Cache.GetOrAdd((System.Reflection.ConstructorInfo)tArgs.ResolvedMember) ) ); } }); }