如何自动创建子类的实例列表,以便能够在应用程序启动时对这些“脚本”调用“执行”方法?
Posted
技术标签:
【中文标题】如何自动创建子类的实例列表,以便能够在应用程序启动时对这些“脚本”调用“执行”方法?【英文标题】:How to autocreate a list of instance of a subclass to be able to call the "execute" method on these "scripts" at application startup? 【发布时间】:2021-03-21 14:26:00 【问题描述】:我有一个系统,使用我的 thingo 的人将能够创建他们自己的脚本。但是,我想这样做,如果用户输入class MyScript : BaseScript
,脚本将被添加到列表中,并且在应用程序开始时,所有从“基本脚本”派生的脚本都将被执行。
有没有办法做到这一点?
【问题讨论】:
抱歉,您的帖子有点不清楚。 “如果用户把课程MyScript : BaseScript
”放在哪里?你有用户界面吗?用户是否在控制台中工作?用户在写代码吗? “使用我的东西的人”什么是 thingo ? “所有从“基本脚本”派生的脚本都将被执行”这听起来像是你需要反射来找到BaseScript
的所有子类,当然,如果你在这里谈论继承。请澄清
听起来像是observer pattern 的候选人,但我不确定,实际上你在问什么还不清楚
是的,如果不清楚,抱歉。我的意思是使用这个(我称之为 API)的人会编写代码,如果他们希望他们的脚本在程序开始时执行,他们会使用class MyScript : BaseScript
。他们将使用继承,因为 BaseScript 类包含 public virtual void Start()
和 public virtual void Update()
之类的东西。但是请记住,此脚本不会在任何时候被实例化,因为这需要手动将其添加到程序的 main()
部分。
那么,像 Unity 中的东西?
是的,有点类似,但脚本不必附加到对象上
【参考方案1】:
我从c# get all inherited classes of a class 文章中找到了一个解决方案,它找到了从一个类派生的所有内容,然后我遍历了创建和实例化它们的列表,现在可以使用了
// Finds all classes derived from the BaseScript class
var scripts = System.Reflection
.Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(TheType => TheType.IsClass
&& TheType.IsSubclassOf(typeof(BaseScript)));
// Adds all of those classes to list
foreach (Type scr in scripts.ToList())
BaseScripts.Add((BaseScript)Activator.CreateInstance(comp));
// Executes the start method in all BaseScripts
foreach (BaseScript scr in BaseScripts.ToList())
scr.Start();
【讨论】:
好的,如果您现在要编辑问题帖子并添加评论中的所有信息,那么这个答案甚至可能会被发现并对未来的读者有用。到目前为止,这是一个非常不清楚的问题的解决方案。可能现在您更容易提出问题所在,因为您已经找到了解决方案以上是关于如何自动创建子类的实例列表,以便能够在应用程序启动时对这些“脚本”调用“执行”方法?的主要内容,如果未能解决你的问题,请参考以下文章