public static bool TryGetPrimitiveElementType(TypeDefinition type, out ElementType etype)
        {
            etype = ElementType.None;

            if (type.Namespace != "System")
                return false;

            Row<ElementType, bool> primitive_data;
            if (TryGetPrimitiveData(type, out primitive_data) && primitive_data.Col1.IsPrimitive())
            {
                etype = primitive_data.Col1;
                return true;
            }

            return false;
        }
 public bool TryGetReverseNestedTypeMapping(TypeDefinition type, out uint declaring)
 {
     return ReverseNestedTypes.TryGetValue(type.token.RID, out declaring);
 }
        static TypeDefinition BinaryRangeSearch(TypeDefinition[] types, uint rid, bool field)
        {
            int min = 0;
            int max = types.Length - 1;
            while (min <= max)
            {
                int mid = min + ((max - min) / 2);
                var type = types[mid];
                var range = field ? type.fields_range : type.methods_range;

                if (rid < range.Start)
                    max = mid - 1;
                else if (rid >= range.Start + range.Length)
                    min = mid + 1;
                else
                    return type;
            }

            return null;
        }
 public bool TryGetNestedTypeMapping(TypeDefinition type, out uint[] mapping)
 {
     return NestedTypes.TryGetValue(type.token.RID, out mapping);
 }
 public bool TryGetPropertiesRange(TypeDefinition type, out Range range)
 {
     return Properties.TryGetValue(type.token.RID, out range);
 }
 public bool TryGetEventsRange(TypeDefinition type, out Range range)
 {
     return Events.TryGetValue(type.token.RID, out range);
 }
 public bool TryGetInterfaceMapping(TypeDefinition type, out MetadataToken[] mapping)
 {
     return Interfaces.TryGetValue(type.token.RID, out mapping);
 }
 public void RemovePropertiesRange(TypeDefinition type)
 {
     Properties.Remove(type.token.RID);
 }
 public void RemoveReverseNestedTypeMapping(TypeDefinition type)
 {
     ReverseNestedTypes.Remove(type.token.RID);
 }
 public void RemoveEventsRange(TypeDefinition type)
 {
     Events.Remove(type.token.RID);
 }
 public void RemoveInterfaceMapping(TypeDefinition type)
 {
     Interfaces.Remove(type.token.RID);
 }
 public void AddTypeDefinition(TypeDefinition type)
 {
     Types[type.token.RID - 1] = type;
 }
        MethodDefinition GetMethod(TypeDefinition type, MethodReference reference)
        {
            while (type != null)
            {
                var method = GetMethod(type.Methods, reference);
                if (method != null)
                    return method;

                if (type.BaseType == null)
                    return null;

                type = Resolve(type.BaseType);
            }

            return null;
        }
        FieldDefinition GetField(TypeDefinition type, FieldReference reference)
        {
            while (type != null)
            {
                var field = GetField(type.Fields, reference);
                if (field != null)
                    return field;

                if (type.BaseType == null)
                    return null;

                type = Resolve(type.BaseType);
            }

            return null;
        }
 /// <summary>
 /// Find a similar method in the given type definition 
 /// </summary>
 /// <param name="tdef">Type definition</param>
 /// <param name="mref">Method reference</param>
 /// <returns>Method definition (or null if not found)</returns>
 public static MethodDefinition FindMatchingMethod(TypeDefinition tdef, MethodReference mref)
 {
     return tdef.Methods.FirstOrDefault(mdef => MethodMatches(mdef, mref));
 }
 /// <summary>
 /// Find a similar field in the given type definition 
 /// </summary>
 /// <param name="tdef">Type definition</param>
 /// <param name="fref">Field reference</param>
 /// <returns>Field definition (or null if not found)</returns>
 public static FieldDefinition FindMatchingField(TypeDefinition tdef, FieldReference fref)
 {
     return
         tdef.Fields.FirstOrDefault(fdef => (fdef.Name == fref.Name) && (fdef.FieldType.FullName == fref.FieldType.FullName));
 }