2 using System.Collections.Generic;
10 internal static class ReflectUtils
12 public static IEnumerable<Type> GetILEdits()
13 => GetLootNonAbstractClasses(t => t.IsSubclassOf(typeof(ILEdit)));
15 public static IEnumerable<MemberInfo> GetStaticAssetTypes()
16 => GetStaticAssetTypesTailRec(
Loot.Instance.Code.GetTypes(), typeof(StaticAssetAttribute));
18 public static IEnumerable<Type> GetLootNonAbstractClasses(Func<Type, bool> fun = null)
19 =>
Loot.Instance.Code.GetTypes().Where(t => t.IsClass && !t.IsAbstract && (fun?.Invoke(t) ??
true));
22 private static IEnumerable<MemberInfo> GetStaticAssetTypesTailRec(Type[] arr, Type attr, IEnumerable<MemberInfo> list = null, IEnumerable<Type> toCheck = null)
24 bool HasAttr(MemberInfo i) =>
Attribute.IsDefined(i, attr);
26 IEnumerable<MemberInfo> GetPropsWithAttr(IEnumerable<Type> col)
29 return col.SelectMany(t => t.GetFields()).Where(f => f.IsStatic).Where(HasAttr).Cast<MemberInfo>()
30 .Concat(col.SelectMany(t => t.GetProperties()).Where(p => p.GetAccessors().Any(a => a.IsStatic)).Where(HasAttr));
33 var types = list ?? GetPropsWithAttr(arr);
34 var nested = (toCheck ?? arr).SelectMany(t => t.GetNestedTypes()).ToArray();
35 if (nested.Length > 0)
37 types = types.Union(GetPropsWithAttr(nested));
38 types = GetStaticAssetTypesTailRec(arr, attr, types, nested);