private void InspectFields(FieldDefinitionHandleCollection fields)
        {
            foreach (var fieldHandle in fields)
            {
                var inspectorField = new InspectorField();

                var fieldDef = metaReader.GetFieldDefinition(fieldHandle);

                var customAttr = fieldDef.GetCustomAttributes();

                foreach (var caHandle in customAttr)
                {
                    // Look for InspectorAttribute
                    if (DecodeCustomAttribute(caHandle, inspectorField))
                    {
                        BlobReader      sigReader = metaReader.GetBlobReader(fieldDef.Signature);
                        SignatureHeader header    = sigReader.ReadSignatureHeader();

                        if (header.Kind != SignatureKind.Field)
                        {
                            continue;
                        }

                        var typeCode = sigReader.ReadSignatureTypeCode();

                        string typeName = typeCode.ToString();

                        if (typeCode == SignatureTypeCode.SZArray)
                        {
                            inspectorField.IsArray = true;
                            SignatureTypeCode code = sigReader.ReadSignatureTypeCode();

                            if (code == SignatureTypeCode.TypeHandle)
                            {
                                bool isEnum;
                                DecodeTypeHandleTypeName(sigReader, out typeName, out isEnum);
                            }
                            else
                            {
                                typeName = code.ToString();
                            }
                        }
                        else if (typeCode == SignatureTypeCode.TypeHandle)
                        {
                            bool isEnum;
                            DecodeTypeHandleTypeName(sigReader, out typeName, out isEnum);
                            inspectorField.IsEnum = isEnum;
                        }

                        inspectorField.TypeName = typeName;
                        inspectorField.Name     = metaReader.GetString(fieldDef.Name);
                        _inspectorComponent.Fields[inspectorField.Name] = inspectorField;

                        break;
                    }
                }
            }
        }
Beispiel #2
0
        private IEnumerable <FieldInfo> GetFieldInfos(FieldDefinitionHandleCollection fieldDefinitionHandles)
        {
            foreach (var fieldHandle in fieldDefinitionHandles)
            {
                var fieldDef  = this.metadataReader.GetFieldDefinition(fieldHandle);
                var fieldName = metadataReader.GetString(fieldDef.Name);
                var fieldType = fieldDef.DecodeSignature <string, GenericContext>(this.provider, null);

                yield return(new FieldInfo(fieldType, fieldName));
            }
        }
        private void InspectFields(FieldDefinitionHandleCollection fields)
        {
            foreach (var fieldHandle in fields)
            {
                var inspectorField = new InspectorField();

                var fieldDef = metaReader.GetFieldDefinition(fieldHandle);

                var customAttr = fieldDef.GetCustomAttributes();

                foreach (var caHandle in customAttr)
                {
                    // Look for InspectorAttribute
                    if (DecodeCustomAttribute(caHandle, inspectorField))
                    {
                        BlobReader      sigReader = metaReader.GetBlobReader(fieldDef.Signature);
                        SignatureHeader header    = sigReader.ReadSignatureHeader();

                        if (header.Kind != SignatureKind.Field)
                        {
                            continue;
                        }

                        var typeCode = sigReader.ReadSignatureTypeCode();

                        string typeName = typeCode.ToString();

                        if (typeCode == SignatureTypeCode.TypeHandle)
                        {
                            EntityHandle token     = sigReader.ReadTypeHandle();
                            HandleKind   tokenType = token.Kind;

                            if (tokenType == HandleKind.TypeDefinition)
                            {
                                // can store local enum typedefs
                                // enum initializers are stored as constant value in the IL

                                var typeDef = metaReader.GetTypeDefinition((TypeDefinitionHandle)token);

                                var baseTypeToken = typeDef.BaseType;

                                if (baseTypeToken.Kind != HandleKind.TypeReference)
                                {
                                    continue;
                                }

                                var baseTypeRef = metaReader.GetTypeReference((TypeReferenceHandle)baseTypeToken);

                                if (metaReader.GetString(baseTypeRef.Name) != "Enum")
                                {
                                    continue;
                                }

                                inspectorField.IsEnum = true;
                                typeName = metaReader.GetString(typeDef.Name);
                            }
                            else if (tokenType == HandleKind.TypeReference)
                            {
                                // TypeReference, ok
                                var typeRef = metaReader.GetTypeReference((TypeReferenceHandle)token);

                                typeName = metaReader.GetString(typeRef.Name);
                            }
                            else
                            {
                                // ???
                                continue;
                            }
                        }

                        inspectorField.TypeName = typeName;
                        inspectorField.Name     = metaReader.GetString(fieldDef.Name);
                        _inspectorComponent.Fields[inspectorField.Name] = inspectorField;

                        break;
                    }
                }
            }
        }