2023-11-21 23:05:03 +08:00

88 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
namespace CPF.Windows.Json
{
internal class BootTable
{
internal Dictionary<Type, MethodInfo> DefaultSameTypes = new Dictionary<Type, MethodInfo>();
internal List<KeyValuePair<Type, MethodInfoOrder>> DefaultImplementedInterfaces = new List<KeyValuePair<Type, MethodInfoOrder>>();
internal List<KeyValuePair<Type, MethodInfoOrder>> DefaultImplementedBaseType = new List<KeyValuePair<Type, MethodInfoOrder>>();
internal HashSet<Type> DefaultAvoidTypes;
internal List<Type> ExpressionBuildTypes = new List<Type>();
public BootTable(BootTableTypeEnum bootTableTypeEnum)
{
Type normalBaseType = null;
Type expressBaseTypes = null;
switch (bootTableTypeEnum)
{
case BootTableTypeEnum.DeserializeResolve:
normalBaseType = typeof(Deserialize.DefaultJsonResolve);
expressBaseTypes = typeof(Deserialize.ExpressionJsonResolve);
break;
case BootTableTypeEnum.SerializerLogic:
normalBaseType = typeof(Serializer.DefaultJsonFormatter);
expressBaseTypes = typeof(Serializer.ExpressionJsonFormatter);
break;
}
var normalMethods = new List<MethodInfo>();
foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
{
if (type.BaseType == expressBaseTypes)
ExpressionBuildTypes.Add(type);
if (type.BaseType == normalBaseType)
normalMethods.AddRange(type.GetMethods(BindingFlags.Static | BindingFlags.NonPublic));
}
foreach (var item in normalMethods)
{
var atr = item.GetCustomAttribute<FuncLableAttribute>();
if (atr == null)
continue;
Type t = null;
switch (bootTableTypeEnum)
{
case BootTableTypeEnum.DeserializeResolve:
t = item.ReturnType;
break;
case BootTableTypeEnum.SerializerLogic:
t = item.GetParameters()[0].ParameterType;
break;
}
switch (atr._Type)
{
case FuncType.SameType:
DefaultSameTypes.Add(t, item);
break;
case FuncType.BaseType:
DefaultImplementedBaseType.Add(new KeyValuePair<Type, MethodInfoOrder>(t, new MethodInfoOrder(item, atr._Priority)));
break;
case FuncType.Interface:
DefaultImplementedInterfaces.Add(new KeyValuePair<Type, MethodInfoOrder>(t, new MethodInfoOrder(item, atr._Priority)));
break;
}
}
DefaultImplementedBaseType = DefaultImplementedBaseType.OrderBy(e => e.Value.Priority).ToList();
DefaultImplementedInterfaces = DefaultImplementedInterfaces.OrderBy(e => e.Value.Priority).ToList();
DefaultAvoidTypes = new HashSet<Type>() {
typeof(Process),
typeof(Delegate),
typeof(Thread),
typeof(Task)
};
}
}
}