internal static Attribute[] LoadCustomAttributes(CodeAttributeDeclarationCollection codeAttributeCollection, DesignTimeType declaringType) { if (declaringType == null) { throw new ArgumentNullException("declaringType"); } if (codeAttributeCollection == null) { return(new Attribute[0]); } List <Attribute> attributes = new List <Attribute>(); // walk through the attributes foreach (CodeAttributeDeclaration codeAttribute in codeAttributeCollection) { String[] argumentNames = new String[codeAttribute.Arguments.Count]; object[] argumentValues = new object[codeAttribute.Arguments.Count]; Type attributeType = declaringType.ResolveType(codeAttribute.Name); if (attributeType != null) { int index = 0; // walk through tha arguments foreach (CodeAttributeArgument codeArgument in codeAttribute.Arguments) { argumentNames[index] = codeArgument.Name; if (codeArgument.Value is CodePrimitiveExpression) { argumentValues[index] = (codeArgument.Value as CodePrimitiveExpression).Value; } else if (codeArgument.Value is CodeTypeOfExpression) { argumentValues[index] = codeArgument.Value; } else if (codeArgument.Value is CodeSnippetExpression) { argumentValues[index] = (codeArgument.Value as CodeSnippetExpression).Value; } else { argumentValues[index] = new ArgumentException(SR.GetString(SR.Error_TypeSystemAttributeArgument)); } index++; } bool alreadyExists = false; foreach (AttributeInfoAttribute attribInfo in attributes) { if (attribInfo.AttributeInfo.AttributeType.FullName.Equals(attributeType.FullName)) { alreadyExists = true; break; } } // bool allowMultiple = false; if (alreadyExists && attributeType.Assembly != null) { object[] usageAttribs = attributeType.GetCustomAttributes(typeof(System.AttributeUsageAttribute), true); if (usageAttribs != null && usageAttribs.Length > 0) { AttributeUsageAttribute usage = usageAttribs[0] as AttributeUsageAttribute; allowMultiple = usage.AllowMultiple; } } // now create and add the placeholder attribute if (!alreadyExists || allowMultiple) { attributes.Add(AttributeInfoAttribute.CreateAttributeInfoAttribute(attributeType, argumentNames, argumentValues)); } } } return(attributes.ToArray()); }
internal static Attribute[] LoadCustomAttributes(CodeAttributeDeclarationCollection codeAttributeCollection, DesignTimeType declaringType) { if (declaringType == null) { throw new ArgumentNullException("declaringType"); } if (codeAttributeCollection == null) { return(new Attribute[0]); } List <Attribute> list = new List <Attribute>(); foreach (CodeAttributeDeclaration declaration in codeAttributeCollection) { string[] argumentNames = new string[declaration.Arguments.Count]; object[] argumentValues = new object[declaration.Arguments.Count]; Type attributeType = declaringType.ResolveType(declaration.Name); if (attributeType != null) { int index = 0; foreach (CodeAttributeArgument argument in declaration.Arguments) { argumentNames[index] = argument.Name; if (argument.Value is CodePrimitiveExpression) { argumentValues[index] = (argument.Value as CodePrimitiveExpression).Value; } else if (argument.Value is CodeTypeOfExpression) { argumentValues[index] = argument.Value; } else if (argument.Value is CodeSnippetExpression) { argumentValues[index] = (argument.Value as CodeSnippetExpression).Value; } else { argumentValues[index] = new ArgumentException(SR.GetString("Error_TypeSystemAttributeArgument")); } index++; } bool flag = false; foreach (AttributeInfoAttribute attribute in list) { if (attribute.AttributeInfo.AttributeType.FullName.Equals(attributeType.FullName)) { flag = true; break; } } bool allowMultiple = false; if (flag && (attributeType.Assembly != null)) { object[] customAttributes = attributeType.GetCustomAttributes(typeof(AttributeUsageAttribute), true); if ((customAttributes != null) && (customAttributes.Length > 0)) { AttributeUsageAttribute attribute2 = customAttributes[0] as AttributeUsageAttribute; allowMultiple = attribute2.AllowMultiple; } } if (!flag || allowMultiple) { list.Add(AttributeInfoAttribute.CreateAttributeInfoAttribute(attributeType, argumentNames, argumentValues)); } } } return(list.ToArray()); }