コード例 #1
0
        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);
        }
コード例 #2
0
        public CustomAttribute GetCustomAttribute(MethodReference ctor, byte [] data)
        {
            CustomAttrib sig = m_sigReader.GetCustomAttrib(data, ctor);

            return(BuildCustomAttribute(ctor, sig));
        }
コード例 #3
0
        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);
                }
            }
        }