/// <summary> /// 通过反射的方式加载所有目标程序集中的动作定义,包括派生的动作定义和反射方法生成的动作定义。 /// </summary> /// <param name="assemblies"></param> /// <returns></returns> public static Dictionary <string, ActionDefine> loadDefinesFromAssemblies(Assembly[] assemblies) { Dictionary <string, ActionDefine> defineDict = new Dictionary <string, ActionDefine>(); foreach (var assembly in assemblies) { foreach (var type in assembly.GetTypes()) { //是ActionDefine的子类,不是抽象类,具有零参数构造函数 if (type.IsSubclassOf(typeof(ActionDefine)) && !type.IsAbstract && type.GetConstructor(new Type[0]) is ConstructorInfo constructor) { ActionDefine actionDefine = (ActionDefine)constructor.Invoke(new object[0]); string name = actionDefine.GetType().Name; if (name.EndsWith("ActionDefine")) { name = name.Substring(0, name.Length - 12); } defineDict.Add(name, actionDefine); } } } foreach (var pair in MethodActionDefine.loadMethodsFromAssemblies(assemblies)) { defineDict.Add(pair.Key, pair.Value); } return(defineDict); }
public Task init(Assembly[] assemblies, Rule rule, GameOption options, IRoomPlayer[] players) { this.rule = rule; if (isInited) { logger.logError("游戏已经初始化"); return(Task.CompletedTask); } isInited = true; //初始化随机 random = new Random(options.randomSeed); //初始化卡片定义 foreach (CardDefine define in rule.cardList) { addDefine(define); } //初始化动作定义 foreach (var pair in ActionDefine.loadDefinesFromAssemblies(assemblies)) { addActionDefine(pair.Key, pair.Value); } return(rule.onGameInit(this, options, players)); }