// // Returns true when DynamicAttribute exists // public bool HasDynamicAttribute (MetadataImporter importer) { if (provider != null) ReadAttribute (importer); return flags != null; }
// // Returns true when object at local position has dynamic attribute flag // public bool IsDynamicObject (MetadataImporter importer) { if (provider != null) ReadAttribute (importer); return flags != null && Position < flags.Length && flags[Position]; }
void ReadAttribute (MetadataImporter importer) { IList<CustomAttributeData> cad; if (provider is MemberInfo) { cad = CustomAttributeData.GetCustomAttributes ((MemberInfo) provider); } else if (provider is ParameterInfo) { cad = CustomAttributeData.GetCustomAttributes ((ParameterInfo) provider); } else { provider = null; return; } if (cad.Count > 0) { foreach (var ca in cad) { var dt = ca.Constructor.DeclaringType; if (dt.Name != "DynamicAttribute" || dt.Namespace != CompilerServicesNamespace) continue; if (ca.ConstructorArguments.Count == 0) { flags = single_attribute; break; } var arg_type = ca.ConstructorArguments[0].ArgumentType; if (arg_type.IsArray && MetaType.GetTypeCode (arg_type.GetElementType ()) == TypeCode.Boolean) { var carg = (IList<CustomAttributeTypedArgument>) ca.ConstructorArguments[0].Value; flags = new bool[carg.Count]; for (int i = 0; i < flags.Length; ++i) { if (MetaType.GetTypeCode (carg[i].ArgumentType) == TypeCode.Boolean) flags[i] = (bool) carg[i].Value; } break; } } } provider = null; }
public ImportedTypeParameterDefinition (MetaType type, MetadataImporter importer) : base (type, importer) { }
public ImportedGenericMethodDefinition (MethodInfo provider, TypeSpec type, AParametersCollection parameters, TypeParameterSpec[] tparams, MetadataImporter importer) : base (provider, type, parameters, importer) { this.tparams = tparams; }
public ImportedParameterMemberDefinition (PropertyInfo provider, TypeSpec type, AParametersCollection parameters, MetadataImporter importer) : base (provider, type, importer) { this.parameters = parameters; }
public ImportedMemberDefinition (MemberInfo member, TypeSpec type, MetadataImporter importer) : base (member, importer) { this.type = type; }
public ImportedDefinition (MemberInfo provider, MetadataImporter importer) { this.provider = provider; this.importer = importer; }
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; }