internal static RuntimeType GetApproxDeclaringType(IRuntimeFieldInfo field) { RuntimeType approxDeclaringType = RuntimeFieldHandle.GetApproxDeclaringType(field.Value); GC.KeepAlive(field); return(approxDeclaringType); }
public FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) { MetadataToken tk = new MetadataToken(metadataToken); if (!MetadataImport.IsValidToken(tk)) throw new ArgumentOutOfRangeException("metadataToken", String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_InvalidToken", tk, this))); RuntimeTypeHandle[] typeArgs = ConvertToTypeHandleArray(genericTypeArguments); RuntimeTypeHandle[] methodArgs = ConvertToTypeHandleArray(genericMethodArguments); try { RuntimeFieldHandle fieldHandle = new RuntimeFieldHandle(); if (!tk.IsFieldDef) { if (!tk.IsMemberRef) throw new ArgumentException("metadataToken", String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_ResolveField"), tk, this)); unsafe { ConstArray sig = MetadataImport.GetMemberRefProps(tk); if (*(CorCallingConvention*)sig.Signature.ToPointer() != CorCallingConvention.Field) throw new ArgumentException("metadataToken", String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_ResolveField"), tk, this)); } fieldHandle = GetModuleHandle().ResolveFieldHandle(tk, typeArgs, methodArgs); } fieldHandle = GetModuleHandle().ResolveFieldHandle(metadataToken, typeArgs, methodArgs); Type declaringType = fieldHandle.GetApproxDeclaringType().GetRuntimeType(); if (declaringType.IsGenericType || declaringType.IsArray) { int tkDeclaringType = GetModuleHandle().GetMetadataImport().GetParentToken(metadataToken); declaringType = ResolveType(tkDeclaringType, genericTypeArguments, genericMethodArguments); } return System.RuntimeType.GetFieldInfo(declaringType.GetTypeHandleInternal(), fieldHandle); } catch(MissingFieldException) { return ResolveLiteralField(tk, genericTypeArguments, genericMethodArguments); } catch (BadImageFormatException e) { throw new ArgumentException(Environment.GetResourceString("Argument_BadImageFormatExceptionResolve"), e); } }
public unsafe FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) { FieldInfo fieldInfo; System.Reflection.MetadataToken token = new System.Reflection.MetadataToken(metadataToken); if (!this.MetadataImport.IsValidToken((int) token)) { throw new ArgumentOutOfRangeException("metadataToken", string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_InvalidToken", new object[] { token, this }), new object[0])); } RuntimeTypeHandle[] typeInstantiationContext = ConvertToTypeHandleArray(genericTypeArguments); RuntimeTypeHandle[] methodInstantiationContext = ConvertToTypeHandleArray(genericMethodArguments); try { RuntimeFieldHandle fieldHandle = new RuntimeFieldHandle(); if (!token.IsFieldDef) { if (!token.IsMemberRef) { throw new ArgumentException("metadataToken", string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_ResolveField"), new object[] { token, this })); } if (*(((byte*) this.MetadataImport.GetMemberRefProps((int) token).Signature.ToPointer())) != 6) { throw new ArgumentException("metadataToken", string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_ResolveField"), new object[] { token, this })); } fieldHandle = this.GetModuleHandle().ResolveFieldHandle((int) token, typeInstantiationContext, methodInstantiationContext); } fieldHandle = this.GetModuleHandle().ResolveFieldHandle(metadataToken, typeInstantiationContext, methodInstantiationContext); Type runtimeType = fieldHandle.GetApproxDeclaringType().GetRuntimeType(); if (runtimeType.IsGenericType || runtimeType.IsArray) { int parentToken = this.GetModuleHandle().GetMetadataImport().GetParentToken(metadataToken); runtimeType = this.ResolveType(parentToken, genericTypeArguments, genericMethodArguments); } fieldInfo = System.RuntimeType.GetFieldInfo(runtimeType.GetTypeHandleInternal(), fieldHandle); } catch (MissingFieldException) { fieldInfo = this.ResolveLiteralField((int) token, genericTypeArguments, genericMethodArguments); } catch (BadImageFormatException exception) { throw new ArgumentException(Environment.GetResourceString("Argument_BadImageFormatExceptionResolve"), exception); } return fieldInfo; }