protected CustomAttribute BuildCustomAttribute(MethodReference ctor, CustomAttrib sig) { CustomAttribute cattr = new CustomAttribute(ctor); foreach (CustomAttrib.FixedArg fa in sig.FixedArgs) { cattr.ConstructorParameters.Add(GetFixedArgValue(fa)); } foreach (CustomAttrib.NamedArg na in sig.NamedArgs) { object value = GetFixedArgValue(na.FixedArg); if (na.Field) { cattr.Fields [na.FieldOrPropName] = value; cattr.SetFieldType(na.FieldOrPropName, GetFixedArgType(na.FixedArg)); } else if (na.Property) { cattr.Properties [na.FieldOrPropName] = value; cattr.SetPropertyType(na.FieldOrPropName, GetFixedArgType(na.FixedArg)); } else { throw new ReflectionException("Non valid named arg"); } } return(cattr); }
public CustomAttribute GetCustomAttribute(MethodReference ctor, byte [] data) { CustomAttrib sig = m_sigReader.GetCustomAttrib(data, ctor); return(BuildCustomAttribute(ctor, sig)); }
void ReadCustomAttributes() { if (!m_tHeap.HasTable(CustomAttributeTable.RId)) { return; } CustomAttributeTable caTable = m_tableReader.GetCustomAttributeTable(); for (int i = 0; i < caTable.Rows.Count; i++) { CustomAttributeRow caRow = caTable [i]; MethodReference ctor; if (caRow.Type.RID == 0) { continue; } if (caRow.Type.TokenType == TokenType.Method) { ctor = GetMethodDefAt(caRow.Type.RID); } else { ctor = GetMemberRefAt(caRow.Type.RID, new GenericContext()) as MethodReference; } CustomAttrib ca = m_sigReader.GetCustomAttrib(caRow.Value, ctor); CustomAttribute cattr = BuildCustomAttribute(ctor, m_root.Streams.BlobHeap.Read(caRow.Value), ca); if (caRow.Parent.RID == 0) { continue; } ICustomAttributeProvider owner = null; switch (caRow.Parent.TokenType) { case TokenType.Assembly: owner = this.Module.Assembly; break; case TokenType.Module: owner = this.Module; break; case TokenType.TypeDef: owner = GetTypeDefAt(caRow.Parent.RID); break; case TokenType.TypeRef: owner = GetTypeRefAt(caRow.Parent.RID); break; case TokenType.Field: owner = GetFieldDefAt(caRow.Parent.RID); break; case TokenType.Method: owner = GetMethodDefAt(caRow.Parent.RID); break; case TokenType.Property: owner = GetPropertyDefAt(caRow.Parent.RID); break; case TokenType.Event: owner = GetEventDefAt(caRow.Parent.RID); break; case TokenType.Param: owner = GetParamDefAt(caRow.Parent.RID); break; case TokenType.GenericParam: owner = GetGenericParameterAt(caRow.Parent.RID); break; default: //TODO: support other ? break; } if (owner != null) { owner.CustomAttributes.Add(cattr); } } }