public IEnumerable EnumerateFields()

in src/Microsoft.Diagnostics.Runtime/DacImplementation/DacTypeHelpers.cs [194:230]


        public IEnumerable<FieldInfo> EnumerateFields(TypeInfo type, int baseFieldCount)
        {
            if (!_sos.GetFieldInfo(type.MethodTable, out MethodTableFieldInfo fieldInfo) || fieldInfo.FirstFieldAddress == 0)
                yield break;

            ulong nextField = fieldInfo.FirstFieldAddress;
            for (int i = baseFieldCount; i < fieldInfo.NumInstanceFields + fieldInfo.NumStaticFields; i++)
            {
                if (!_sos.GetFieldData(nextField, out FieldData dacFieldData))
                    break;

                if (dacFieldData.IsContextLocal == 0)
                {
                    FieldKind kind;
                    if (dacFieldData.IsThreadLocal != 0)
                        kind = FieldKind.ThreadStatic;
                    else if (dacFieldData.IsStatic != 0)
                        kind = FieldKind.Static;
                    else if (dacFieldData.IsContextLocal != 0)
                        kind = FieldKind.Unsupported;
                    else
                        kind = FieldKind.Instance;

                    yield return new()
                    {
                        FieldDesc = nextField,
                        MethodTable = dacFieldData.TypeMethodTable,
                        ElementType = (ClrElementType)dacFieldData.ElementType,
                        Offset = dacFieldData.Offset <= int.MaxValue ? (int)dacFieldData.Offset : int.MaxValue,
                        Token = dacFieldData.FieldToken <= int.MaxValue ? (int)dacFieldData.FieldToken : int.MaxValue,
                        Kind = kind,
                    };
                }

                nextField = dacFieldData.NextField;
            }
        }