public static AttributesBag Read (MemberInfo mi, MetadataImporter importer) { AttributesBag bag = null; List<string> conditionals = null; // It should not throw any loading exception IList<CustomAttributeData> attrs = CustomAttributeData.GetCustomAttributes (mi); foreach (var a in attrs) { var dt = a.Constructor.DeclaringType; string name = dt.Name; if (name == "ObsoleteAttribute") { if (dt.Namespace != "System") continue; if (bag == null) bag = new AttributesBag (); var args = a.ConstructorArguments; if (args.Count == 1) { bag.Obsolete = new ObsoleteAttribute ((string) args[0].Value); } else if (args.Count == 2) { bag.Obsolete = new ObsoleteAttribute ((string) args[0].Value, (bool) args[1].Value); } else { bag.Obsolete = new ObsoleteAttribute (); } continue; } if (name == "ConditionalAttribute") { if (dt.Namespace != "System.Diagnostics") continue; if (bag == null) bag = new AttributesBag (); if (conditionals == null) conditionals = new List<string> (2); conditionals.Add ((string) a.ConstructorArguments[0].Value); continue; } if (name == "CLSCompliantAttribute") { if (dt.Namespace != "System") continue; if (bag == null) bag = new AttributesBag (); bag.CLSAttributeValue = (bool) a.ConstructorArguments[0].Value; continue; } // Type only attributes if (mi.MemberType == MemberTypes.TypeInfo || mi.MemberType == MemberTypes.NestedType) { if (name == "DefaultMemberAttribute") { if (dt.Namespace != "System.Reflection") continue; if (bag == null) bag = new AttributesBag (); bag.DefaultIndexerName = (string) a.ConstructorArguments[0].Value; continue; } if (name == "AttributeUsageAttribute") { if (dt.Namespace != "System") continue; if (bag == null) bag = new AttributesBag (); bag.AttributeUsage = new AttributeUsageAttribute ((AttributeTargets) a.ConstructorArguments[0].Value); foreach (var named in a.NamedArguments) { if (named.MemberInfo.Name == "AllowMultiple") bag.AttributeUsage.AllowMultiple = (bool) named.TypedValue.Value; else if (named.MemberInfo.Name == "Inherited") bag.AttributeUsage.Inherited = (bool) named.TypedValue.Value; } continue; } // Interface only attribute if (name == "CoClassAttribute") { if (dt.Namespace != "System.Runtime.InteropServices") continue; if (bag == null) bag = new AttributesBag (); bag.CoClass = importer.ImportType ((MetaType) a.ConstructorArguments[0].Value); continue; } } } if (bag == null) return Default; if (conditionals != null) bag.Conditionals = conditionals.ToArray (); return bag; }
protected void ReadAttributes () { cattrs = AttributesBag.Read (provider, importer); }
protected virtual void ReadAttributes () { cattrs = AttributesBag.Read (provider, null); }