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, _ => "" }; } /// /// 公开方法:获取FunGame.Implement.DLL中指定方法的返回值 /// /// 接口代号 /// 方法代号 /// public static object? GetFunGameImplValue(InterfaceType Interface, InterfaceMethod Method) { MethodInfo? MethodInfo; Assembly? Assembly = System.Reflection.Assembly.LoadFile(ReflectionSet.EXEFolderPath + ReflectionSet.FUNGAME_IMPL + ".dll"); Type? Type = GetFunGameImplementType(Assembly, Interface); // 通过类名获取命名空间+类名称 string MethodName = GetImplementMethodName(Method); // 获取方法名 if (Assembly != null && Type != null) MethodInfo = Type.GetMethod(MethodName); // 从Type中查找方法名 else return null; object? Instance = Assembly.CreateInstance(Type.Namespace + "." + Type.Name); if (Instance != null && MethodInfo != null) { object? value = MethodInfo.Invoke(Instance, Array.Empty()); // 实例方法的调用 if (value != null) return value; else return null; } return null; } } }