private static AttributeUsageAttribute RetrieveAttributeUsage(Type attributeType) { if (attributeType == typeof(AttributeUsageAttribute)) { return(new AttributeUsageAttribute(AttributeTargets.Class)); } AttributeUsageAttribute attributeUsageAttribute = null; object[] customAttributes = MonoCustomAttrs.GetCustomAttributes(attributeType, MonoCustomAttrs.AttributeUsageType, false); if (customAttributes.Length == 0) { if (attributeType.BaseType != null) { attributeUsageAttribute = MonoCustomAttrs.RetrieveAttributeUsage(attributeType.BaseType); } if (attributeUsageAttribute != null) { return(attributeUsageAttribute); } return(MonoCustomAttrs.DefaultAttributeUsage); } else { if (customAttributes.Length > 1) { throw new FormatException("Duplicate AttributeUsageAttribute cannot be specified on an attribute type."); } return((AttributeUsageAttribute)customAttributes[0]); } }
internal static object[] GetCustomAttributes(ICustomAttributeProvider obj, Type attributeType, bool inherit) { if (obj == null) { throw new ArgumentNullException("obj"); } if (attributeType == null) { throw new ArgumentNullException("attributeType"); } if (attributeType == typeof(MonoCustomAttrs)) { attributeType = null; } object[] customAttributesBase = MonoCustomAttrs.GetCustomAttributesBase(obj, attributeType); if (!inherit && customAttributesBase.Length == 1) { object[] array; if (attributeType != null) { if (attributeType.IsAssignableFrom(customAttributesBase[0].GetType())) { array = (object[])Array.CreateInstance(attributeType, 1); array[0] = customAttributesBase[0]; } else { array = (object[])Array.CreateInstance(attributeType, 0); } } else { array = (object[])Array.CreateInstance(customAttributesBase[0].GetType(), 1); array[0] = customAttributesBase[0]; } return(array); } if (attributeType != null && attributeType.IsSealed && inherit) { AttributeUsageAttribute attributeUsageAttribute = MonoCustomAttrs.RetrieveAttributeUsage(attributeType); if (!attributeUsageAttribute.Inherited) { inherit = false; } } int capacity = (customAttributesBase.Length >= 16) ? 16 : customAttributesBase.Length; Hashtable hashtable = new Hashtable(capacity); ArrayList arrayList = new ArrayList(capacity); ICustomAttributeProvider customAttributeProvider = obj; int num = 0; do { foreach (object obj2 in customAttributesBase) { Type type = obj2.GetType(); if (attributeType == null || attributeType.IsAssignableFrom(type)) { MonoCustomAttrs.AttributeInfo attributeInfo = (MonoCustomAttrs.AttributeInfo)hashtable[type]; AttributeUsageAttribute attributeUsageAttribute2; if (attributeInfo != null) { attributeUsageAttribute2 = attributeInfo.Usage; } else { attributeUsageAttribute2 = MonoCustomAttrs.RetrieveAttributeUsage(type); } if ((num == 0 || attributeUsageAttribute2.Inherited) && (attributeUsageAttribute2.AllowMultiple || attributeInfo == null || (attributeInfo != null && attributeInfo.InheritanceLevel == num))) { arrayList.Add(obj2); } if (attributeInfo == null) { hashtable.Add(type, new MonoCustomAttrs.AttributeInfo(attributeUsageAttribute2, num)); } } } if ((customAttributeProvider = MonoCustomAttrs.GetBase(customAttributeProvider)) != null) { num++; customAttributesBase = MonoCustomAttrs.GetCustomAttributesBase(customAttributeProvider, attributeType); } }while (inherit && customAttributeProvider != null); object[] array3; if (attributeType == null || attributeType.IsValueType) { array3 = (object[])Array.CreateInstance(typeof(Attribute), arrayList.Count); } else { array3 = (Array.CreateInstance(attributeType, arrayList.Count) as object[]); } arrayList.CopyTo(array3, 0); return(array3); }