/// <summary> /// Get fields for this type /// </summary> /// <param name="publicishOnly">If true, only return public or protected methods (for an unsealed type)</param> public ImmutableArray <MrField> GetFields(bool publicishOnly = true) { if (IsFakeType || IsTypeCode) { return(ImmutableArray <MrField> .Empty); } var fieldDefinitionHandles = TypeDefinition.GetFields(); List <MrField> fieldsList = null; foreach (var fieldDefinitionHandle in fieldDefinitionHandles) { var field = MrField.TryCreate(fieldDefinitionHandle, this, publicishOnly); if (field == null) { continue; } // For a property named Foo, the compiler may generate a private field named // <Foo>k__BackingField if (field.GetName().EndsWith(">k__BackingField")) { continue; } if (fieldsList == null) { fieldsList = new List <MrField>(fieldDefinitionHandles.Count); } fieldsList.Add(field); } return(fieldsList == null ? ImmutableArray <MrField> .Empty : fieldsList.ToImmutableArray()); }
/// <summary> /// Get fields for this type /// </summary> /// <param name="publicishOnly">If true, only return public or protected methods (for an unsealed type)</param> public ImmutableArray <MrField> GetFields(bool publicishOnly = true) { if (IsFakeType || IsTypeCode) { return(ImmutableArray <MrField> .Empty); } var fieldDefinitionHandles = TypeDefinition.GetFields(); List <MrField> fieldsList = null; foreach (var fieldDefinitionHandle in fieldDefinitionHandles) { var field = MrField.TryCreate(fieldDefinitionHandle, this, publicishOnly); if (field == null) { continue; } // For a property named Foo, the compiler may generate a private field named // <Foo>k__BackingField if (field.IsPrivate && field.GetName().EndsWith(">k__BackingField")) { continue; } // Bugbug: For an event named FooHappened, the compiler generates a private field named // FooHappened. How to filter this out? If you're only looking for public types and the // event is public, it's not an issue. But if you're also looking non-public types, // you'll see FooHappened as both an event and a field. There doesn't seem to be any // kind of marking in the metadata to indicate that the field is special. // I think maybe you need to check to see if there's an event and field by the same // name, but I hate to take that overhead on every field lookup. if (fieldsList == null) { fieldsList = new List <MrField>(fieldDefinitionHandles.Count); } fieldsList.Add(field); } return(fieldsList == null ? ImmutableArray <MrField> .Empty : fieldsList.ToImmutableArray()); }