using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using Torch.Utils; namespace Torch.Tests { public class ReflectionTestManager { #region FieldProvider public struct FieldRef { public FieldInfo Field; public FieldRef(FieldInfo f) { Field = f; } public override string ToString() { if (Field == null) return "Ignored"; return Field.DeclaringType?.FullName + "." + Field.Name; } } private readonly HashSet _getters = new HashSet(); private readonly HashSet _setters = new HashSet(); private readonly HashSet _invokers = new HashSet(); private readonly HashSet _memberInfo = new HashSet(); private readonly HashSet _events = new HashSet(); public ReflectionTestManager() { _getters.Add(new object[] { new FieldRef(null) }); _setters.Add(new object[] { new FieldRef(null) }); _invokers.Add(new object[] { new FieldRef(null) }); _memberInfo.Add(new object[] {new FieldRef(null)}); _events.Add(new object[] {new FieldRef(null)}); } public ReflectionTestManager Init(Assembly asm) { try { foreach (Type type in asm.GetTypes()) Init(type); } catch (ReflectionTypeLoadException e) { throw e.LoaderExceptions[0]; } return this; } public ReflectionTestManager Init(Type type) { foreach (FieldInfo field in type.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { var args = new object[] { new FieldRef(field) }; foreach (ReflectedMemberAttribute attr in field.GetCustomAttributes()) { if (!field.IsStatic) throw new ArgumentException("Field must be static to be reflected"); switch (attr) { case ReflectedMethodAttribute rma: _invokers.Add(args); break; case ReflectedGetterAttribute rga: _getters.Add(args); break; case ReflectedSetterAttribute rsa: _setters.Add(args); break; case ReflectedFieldInfoAttribute rfia: case ReflectedPropertyInfoAttribute rpia: case ReflectedMethodInfoAttribute rmia: _memberInfo.Add(args); break; } } var reflectedEventReplacer = field.GetCustomAttribute(); if (reflectedEventReplacer != null) { if (!field.IsStatic) throw new ArgumentException("Field must be static to be reflected"); _events.Add(args); } } return this; } public IEnumerable Getters => _getters; public IEnumerable Setters => _setters; public IEnumerable Invokers => _invokers; public IEnumerable MemberInfo => _memberInfo; public IEnumerable Events => _events; #endregion } }