Mono.CSharp.ImportedDefinition.AttributesBag.Read C# (CSharp) Method

Read() public static method

public static Read ( MemberInfo mi, MetadataImporter importer ) : AttributesBag
mi MemberInfo
importer MetadataImporter
return AttributesBag
            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);

                string ns, name;
                foreach (var a in attrs) {
                    importer.GetCustomAttributeTypeName (a, out ns, out name);
                    if (name == "ObsoleteAttribute") {
                        if (ns != "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 (ns != "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 (ns != "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 (ns != "System.Reflection")
                                continue;

                            if (bag == null)
                                bag = new AttributesBag ();

                            bag.DefaultIndexerName = (string) a.ConstructorArguments[0].Value;
                            continue;
                        }

                        if (name == "AttributeUsageAttribute") {
                            if (ns != "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 (ns != "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;
            }
ImportedDefinition.AttributesBag