private MemberInfo GetOrAddPropertyInfo(PropertyHandle handle) { if (this.properties == null) { properties = new Dictionary <PropertyHandle, MemberInfo>(); } MemberInfo result = null; if (!properties.TryGetValue(handle, out result)) { var property = metadataReader.GetProperty(handle); var propertyMethodHandles = property.GetAssociatedMethods(); TypeHandle declaringTypeHandle; MethodHandle accessorMethod = propertyMethodHandles.Getter; if (accessorMethod.IsNil) { accessorMethod = propertyMethodHandles.Setter; } declaringTypeHandle = metadataReader.GetDeclaringType(accessorMethod); result = new MemberInfo(MemberKind.Property); result.Token = this.metadataReader.GetToken(handle); result.DeclaringTypeHandle = declaringTypeHandle; result.Handle = handle; properties.Add(handle, result); } return(result); }
public bool TryGetProperty(string name, out PropertyHandle handle) { if (this.propertyDefs == null) { this.propertyDefs = GetPropertyDefs(this.reader, this.typeHandle); } return(this.propertyDefs.TryGetValue(name, out handle)); }
// // propertyHandle - the "tkPropertyDef" that identifies the property. // definingType - the "tkTypeDef" that defined the field (this is where you get the metadata reader that created propertyHandle.) // contextType - the type that supplies the type context (i.e. substitutions for generic parameters.) Though you // get your raw information from "definingType", you report "contextType" as your DeclaringType property. // // For example: // // typeof(Foo<>).GetTypeInfo().DeclaredMembers // // The definingType and contextType are both Foo<> // // typeof(Foo<int,String>).GetTypeInfo().DeclaredMembers // // The definingType is "Foo<,>" // The contextType is "Foo<int,String>" // // We don't report any DeclaredMembers for arrays or generic parameters so those don't apply. // private RuntimePropertyInfo(PropertyHandle propertyHandle, RuntimeNamedTypeInfo definingTypeInfo, RuntimeTypeInfo contextTypeInfo) { _propertyHandle = propertyHandle; _definingTypeInfo = definingTypeInfo; _contextTypeInfo = contextTypeInfo; _reader = definingTypeInfo.Reader; _property = propertyHandle.GetProperty(_reader); }
// // propertyHandle - the "tkPropertyDef" that identifies the property. // definingType - the "tkTypeDef" that defined the field (this is where you get the metadata reader that created propertyHandle.) // contextType - the type that supplies the type context (i.e. substitutions for generic parameters.) Though you // get your raw information from "definingType", you report "contextType" as your DeclaringType property. // // For example: // // typeof(Foo<>).GetTypeInfo().DeclaredMembers // // The definingType and contextType are both Foo<> // // typeof(Foo<int,String>).GetTypeInfo().DeclaredMembers // // The definingType is "Foo<,>" // The contextType is "Foo<int,String>" // // We don't report any DeclaredMembers for arrays or generic parameters so those don't apply. // private RuntimePropertyInfo(PropertyHandle propertyHandle, RuntimeNamedTypeInfo definingTypeInfo, RuntimeTypeInfo contextTypeInfo) { _propertyHandle = propertyHandle; _definingTypeInfo = definingTypeInfo; _contextTypeInfo = contextTypeInfo; _reader = definingTypeInfo.Reader; _property = propertyHandle.GetProperty(_reader); }
} // Read public static uint Read(this NativeReader reader, uint offset, out PropertyHandle handle) { uint value; offset = reader.DecodeUnsigned(offset, out value); handle = new PropertyHandle((int)value); handle._Validate(); return(offset); } // Read
internal override bool TryGetPropertyHandle(Cci.IPropertyDefinition def, out PropertyHandle handle) { var other = this.mapToMetadata.MapDefinition(def) as PEPropertySymbol; if ((object)other != null) { handle = other.Handle; return(true); } else { handle = default(PropertyHandle); return(false); } }
internal override bool TryGetPropertyHandle(Cci.IPropertyDefinition def, out PropertyHandle handle) { var other = this.mapToMetadata.MapDefinition(def) as PEPropertySymbol; if ((object)other != null) { handle = other.Handle; return true; } else { handle = default(PropertyHandle); return false; } }
internal static RuntimePropertyInfo GetRuntimePropertyInfo(PropertyHandle propertyHandle, RuntimeNamedTypeInfo definingTypeInfo, RuntimeTypeInfo contextTypeInfo) { return(new RuntimePropertyInfo(propertyHandle, definingTypeInfo, contextTypeInfo).WithDebugName()); }
internal abstract bool TryGetPropertyHandle(Cci.IPropertyDefinition def, out PropertyHandle handle);
internal PEPropertySymbol( PEModuleSymbol moduleSymbol, PENamedTypeSymbol containingType, PropertyHandle handle, PEMethodSymbol getMethod, PEMethodSymbol setMethod) { Debug.Assert((object)moduleSymbol != null); Debug.Assert((object)containingType != null); Debug.Assert(!handle.IsNil); this.containingType = containingType; var module = moduleSymbol.Module; PropertyAttributes mdFlags = 0; BadImageFormatException mrEx = null; try { module.GetPropertyDefPropsOrThrow(handle, out this.name, out mdFlags); } catch (BadImageFormatException e) { mrEx = e; if ((object)this.name == null) { this.name = string.Empty; } } this.getMethod = getMethod; this.setMethod = setMethod; this.handle = handle; var metadataDecoder = new MetadataDecoder(moduleSymbol, containingType); byte callingConvention; BadImageFormatException propEx; var propertyParams = metadataDecoder.GetSignatureForProperty(handle, out callingConvention, out propEx); Debug.Assert(propertyParams.Length > 0); byte unusedCallingConvention; BadImageFormatException getEx = null; var getMethodParams = (object)getMethod == null ? null : metadataDecoder.GetSignatureForMethod(getMethod.Handle, out unusedCallingConvention, out getEx); BadImageFormatException setEx = null; var setMethodParams = (object)setMethod == null ? null : metadataDecoder.GetSignatureForMethod(setMethod.Handle, out unusedCallingConvention, out setEx); // NOTE: property parameter names are not recorded in metadata, so we have to // use the parameter names from one of the indexers. // NB: prefer setter names to getter names if both are present. bool isBad; this.parameters = GetParameters(moduleSymbol, this, propertyParams, setMethodParams ?? getMethodParams, out isBad); if (propEx != null || getEx != null || setEx != null || mrEx != null || isBad) { lazyUseSiteDiagnostic = new CSDiagnosticInfo(ErrorCode.ERR_BindToBogus, this); } this.typeCustomModifiers = CSharpCustomModifier.Convert(propertyParams[0].CustomModifiers); // CONSIDER: Can we make parameter type computation lazy? TypeSymbol originalPropertyType = propertyParams[0].Type; this.propertyType = DynamicTypeDecoder.TransformType(originalPropertyType, typeCustomModifiers.Length, handle, moduleSymbol); // Dynamify object type if necessary this.propertyType = this.propertyType.AsDynamicIfNoPia(this.containingType); // A property is bogus and must be accessed by calling its accessors directly if the // accessor signatures do not agree, both with each other and with the property, // or if it has parameters and is not an indexer or indexed property. bool callMethodsDirectly = !DoSignaturesMatch(module, metadataDecoder, propertyParams, this.getMethod, getMethodParams, this.setMethod, setMethodParams) || MustCallMethodsDirectlyCore(); if (!callMethodsDirectly) { if ((object)this.getMethod != null) { this.getMethod.SetAssociatedProperty(this, MethodKind.PropertyGet); } if ((object)this.setMethod != null) { this.setMethod.SetAssociatedProperty(this, MethodKind.PropertySet); } } if (callMethodsDirectly) { flags |= Flags.CallMethodsDirectly; } if ((mdFlags & PropertyAttributes.SpecialName) != 0) { flags |= Flags.IsSpecialName; } if ((mdFlags & PropertyAttributes.RTSpecialName) != 0) { flags |= Flags.IsRuntimeSpecialName; } }
internal static RuntimePropertyInfo GetRuntimePropertyInfo(PropertyHandle propertyHandle, NativeFormatRuntimeNamedTypeInfo definingTypeInfo, RuntimeTypeInfo contextTypeInfo, RuntimeTypeInfo reflectedType) { return(new NativeFormatRuntimePropertyInfo(propertyHandle, definingTypeInfo, contextTypeInfo, reflectedType).WithDebugName()); }
private MemberInfo GetOrAddPropertyInfo(PropertyHandle handle) { if (this.properties == null) { properties = new Dictionary<PropertyHandle, MemberInfo>(); } MemberInfo result = null; if (!properties.TryGetValue(handle, out result)) { var property = metadataReader.GetProperty(handle); var propertyMethodHandles = property.GetAssociatedMethods(); TypeHandle declaringTypeHandle; MethodHandle accessorMethod = propertyMethodHandles.Getter; if (accessorMethod.IsNil) { accessorMethod = propertyMethodHandles.Setter; } declaringTypeHandle = metadataReader.GetDeclaringType(accessorMethod); result = new MemberInfo(MemberKind.Property); result.Token = this.metadataReader.GetToken(handle); result.DeclaringTypeHandle = declaringTypeHandle; result.Handle = handle; properties.Add(handle, result); } return result; }
public sealed override bool GetDefaultValueIfAny(MetadataReader reader, PropertyHandle propertyHandle, Type declaredType, IEnumerable<CustomAttributeData> customAttributes, out Object defaultValue) { Property property = propertyHandle.GetProperty(reader); return DefaultValueParser.GetDefaultValueIfAny(DefaultValueParser.MemberType.Property, reader, property.DefaultValue, declaredType, customAttributes, out defaultValue); }
public sealed override IEnumerable<CustomAttributeData> GetPsuedoCustomAttributes(MetadataReader reader, PropertyHandle propertyHandle, TypeDefinitionHandle declaringTypeHandle) { return Empty<CustomAttributeData>.Enumerable; }
public sealed override bool GetDefaultValueIfAny(MetadataReader reader, PropertyHandle propertyHandle, Type declaredType, IEnumerable <CustomAttributeData> customAttributes, out Object defaultValue) { Property property = propertyHandle.GetProperty(reader); return(DefaultValueParser.GetDefaultValueIfAny(DefaultValueParser.MemberType.Property, reader, property.DefaultValue, declaredType, customAttributes, out defaultValue)); }
public sealed override IEnumerable <CustomAttributeData> GetPsuedoCustomAttributes(MetadataReader reader, PropertyHandle propertyHandle, TypeDefinitionHandle declaringTypeHandle) { return(Empty <CustomAttributeData> .Enumerable); }
internal abstract bool TryGetPropertyHandle(IPropertyDefinition def, out PropertyHandle handle);
public abstract bool GetDefaultValueIfAny(MetadataReader reader, PropertyHandle propertyHandle, Type declaredType, IEnumerable <CustomAttributeData> customAttributes, out Object defaultValue);
public abstract bool GetDefaultValueIfAny(MetadataReader reader, PropertyHandle propertyHandle, Type declaredType, IEnumerable<CustomAttributeData> customAttributes, out Object defaultValue);
public abstract IEnumerable <CustomAttributeData> GetPsuedoCustomAttributes(MetadataReader reader, PropertyHandle propertyHandle, TypeDefinitionHandle declaringTypeHandle);
public abstract IEnumerable<CustomAttributeData> GetPsuedoCustomAttributes(MetadataReader reader, PropertyHandle propertyHandle, TypeDefinitionHandle declaringTypeHandle);
internal PEPropertySymbol( PEModuleSymbol moduleSymbol, PENamedTypeSymbol containingType, PropertyHandle handle, PEMethodSymbol getMethod, PEMethodSymbol setMethod) { Debug.Assert((object)moduleSymbol != null); Debug.Assert((object)containingType != null); Debug.Assert(!handle.IsNil); this.containingType = containingType; var module = moduleSymbol.Module; PropertyAttributes mdFlags = 0; BadImageFormatException mrEx = null; try { module.GetPropertyDefPropsOrThrow(handle, out this.name, out mdFlags); } catch (BadImageFormatException e) { mrEx = e; if ((object)this.name == null) { this.name = string.Empty; } } this.getMethod = getMethod; this.setMethod = setMethod; this.handle = handle; var metadataDecoder = new MetadataDecoder(moduleSymbol, containingType); byte callingConvention; BadImageFormatException propEx; var propertyParams = metadataDecoder.GetSignatureForProperty(handle, out callingConvention, out propEx); Debug.Assert(propertyParams.Length > 0); byte unusedCallingConvention; BadImageFormatException getEx = null; var getMethodParams = (object)getMethod == null ? null : metadataDecoder.GetSignatureForMethod(getMethod.Handle, out unusedCallingConvention, out getEx); BadImageFormatException setEx = null; var setMethodParams = (object)setMethod == null ? null : metadataDecoder.GetSignatureForMethod(setMethod.Handle, out unusedCallingConvention, out setEx); // NOTE: property parameter names are not recorded in metadata, so we have to // use the parameter names from one of the indexers. // NB: prefer setter names to getter names if both are present. bool isBad; this.parameters = GetParameters(moduleSymbol, this, propertyParams, setMethodParams ?? getMethodParams, out isBad); if (propEx != null || getEx != null || setEx != null || mrEx != null || isBad) { lazyUseSiteDiagnostic = new CSDiagnosticInfo(ErrorCode.ERR_BindToBogus, this); } this.typeCustomModifiers = CSharpCustomModifier.Convert(propertyParams[0].CustomModifiers); // CONSIDER: Can we make parameter type computation lazy? TypeSymbol originalPropertyType = propertyParams[0].Type; this.propertyType = DynamicTypeDecoder.TransformType(originalPropertyType, typeCustomModifiers.Length, handle, moduleSymbol); // Dynamify object type if necessary this.propertyType = this.propertyType.AsDynamicIfNoPia(this.containingType); // A property is bogus and must be accessed by calling its accessors directly if the // accessor signatures do not agree, both with each other and with the property, // or if it has parameters and is not an indexer or indexed property. bool callMethodsDirectly = !DoSignaturesMatch(module, metadataDecoder, propertyParams, this.getMethod, getMethodParams, this.setMethod, setMethodParams) || MustCallMethodsDirectlyCore(); if (!callMethodsDirectly) { if ((object)this.getMethod != null) { this.getMethod.SetAssociatedProperty(this, MethodKind.PropertyGet); } if ((object)this.setMethod != null) { this.setMethod.SetAssociatedProperty(this, MethodKind.PropertySet); } } if (callMethodsDirectly) { flags |= Flags.CallMethodsDirectly; } if ((mdFlags & PropertyAttributes.SpecialName) != 0) { flags |= Flags.IsSpecialName; } if ((mdFlags & PropertyAttributes.RTSpecialName) != 0) { flags |= Flags.IsRuntimeSpecialName; } }
public bool TryGetProperty(string name, out PropertyHandle handle) { if (this.propertyDefs == null) { this.propertyDefs = GetPropertyDefs(this.reader, this.typeHandle); } return this.propertyDefs.TryGetValue(name, out handle); }