using System.Reflection; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Api.Utility { /// /// See: , , /// public class Implement { /// /// 获取FunGame.Implement.dll中接口的实现方法 /// /// 程序集 /// 接口代号 /// private static Type? GetFunGameImplementType(Assembly Assembly, InterfaceType Interface) { // 通过类名获取命名空间+类名称 string ClassName = GetImplementClassName(Interface); List? Classes = null; if (Assembly != null) { Classes = Assembly.GetTypes().Where(w => w.Namespace == "Milimoe.FunGame.Core.Implement" && w.Name.Contains(ClassName) ).ToList(); if (Classes != null && Classes.Count > 0) return Classes[0]; else return null; } else return null; } /// /// 获取接口实现类类名 /// /// 接口类型 /// private static string GetImplementClassName(InterfaceType Interface) { return Interface switch { InterfaceType.IClient => InterfaceSet.Type.IClient, InterfaceType.IServer => InterfaceSet.Type.IServer, _ => "" }; } /// /// 获取接口方法名(支持属性) /// /// 方法 /// private static string GetImplementMethodName(InterfaceMethod Method) { return Method switch { InterfaceMethod.RemoteServerIP => InterfaceSet.Method.RemoteServerIP, InterfaceMethod.DBConnection => InterfaceSet.Method.DBConnection, InterfaceMethod.GetServerSettings => InterfaceSet.Method.GetServerSettings, InterfaceMethod.SecretKey => InterfaceSet.Method.SecretKey, _ => "" }; } /// /// 公开方法:获取FunGame.Implement.DLL中指定方法(属性)的返回值 /// /// 接口代号 /// 方法代号(支持属性) /// 是否是方法(如是属性请传入false) /// public static object? GetFunGameImplValue(InterfaceType Interface, InterfaceMethod Method, bool IsMethod = true) { MethodInfo? MethodInfo; PropertyInfo? PropertyInfo; // 反射读取程序集 Assembly? Assembly = System.Reflection.Assembly.LoadFile(ReflectionSet.EXEFolderPath + ReflectionSet.FUNGAME_IMPL + ".dll"); // 通过类名获取命名空间+类名称 Type? Type = GetFunGameImplementType(Assembly, Interface); if (Assembly != null && Type != null) { // 创建类对象 object? Instance = Assembly.CreateInstance(Type.Namespace + "." + Type.Name); // 获取方法/属性名 string MethodName = GetImplementMethodName(Method); if (IsMethod) { // 从Type中查找方法名 MethodInfo = Type.GetMethod(MethodName); if (Instance != null && MethodInfo != null) { object? value = MethodInfo.Invoke(Instance, []); if (value != null) return value; } } else { PropertyInfo = Type.GetProperty(MethodName); if (Instance != null && PropertyInfo != null) { object? value = PropertyInfo.GetValue(Instance); if (value != null) return value; } } } return null; } } }