/// <summary> /// Sets the attributes. /// </summary> /// <param name="module">The module.</param> /// <param name="owner">The owner.</param> /// <param name="attributes">The attributes.</param> private void SetAttributes(IMetadataModule module, TokenTypes owner, List <CustomAttributeRow> attributes) { ITypeSystem ts = (ITypeSystem)this; // Convert the custom attribute rows to RuntimeAttribute instances RuntimeAttribute[] ra = new RuntimeAttribute[attributes.Count]; for (int i = 0; i < attributes.Count; i++) { ra[i] = new RuntimeAttribute(module, attributes[i]); } // The following switch matches the AttributeTargets enumeration against // metadata tables, which make valid targets for an attribute. switch (owner & TokenTypes.TableMask) { case TokenTypes.Assembly: // AttributeTargets.Assembly break; case TokenTypes.TypeDef: // AttributeTargets.Class // AttributeTargets.Delegate // AttributeTargets.Enum // AttributeTargets.Interface // AttributeTargets.Struct RuntimeType type = ts.GetType(module, owner); type.SetAttributes(ra); if (rtCallTypeAttribute != null) { if (type.IsDefined(rtCallTypeAttribute) == true) { this.internalTypes.Add(type); } } break; case TokenTypes.MethodDef: // AttributeTargets.Constructor // AttributeTargets.Method RuntimeMethod method = ts.GetMethod(module, owner); method.SetAttributes(ra); break; case TokenTypes.Event: // AttributeTargets.Event break; case TokenTypes.Field: // AttributeTargets.Field break; case TokenTypes.GenericParam: // AttributeTargets.GenericParameter break; case TokenTypes.Module: // AttributeTargets.Module break; case TokenTypes.Param: // AttributeTargets.Parameter // AttributeTargets.ReturnValue break; case TokenTypes.Property: // AttributeTargets.StackFrameIndex break; } }