如何自动创建子类的实例列表,以便能够在应用程序启动时对这些“脚本”调用“执行”方法?

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();

【讨论】:

好的,如果您现在要编辑问题帖子并添加评论中的所有信息,那么这个答案甚至可能会被发现并对未来的读者有用。到目前为止,这是一个非常不清楚的问题的解决方案。可能现在您更容易提出问题所在,因为您已经找到了解决方案

以上是关于如何自动创建子类的实例列表,以便能够在应用程序启动时对这些“脚本”调用“执行”方法?的主要内容,如果未能解决你的问题,请参考以下文章

Java的:创建子类的N个实例的矢量

无法在Visual Studio中的Storyboard编辑器中添加图像,以便为Xamarin.iOS创建启动画面

mypy:创建一个接受子类实例列表的类型

SKSpriteNode 的正确子类化和实例初始化

父类如何获取子类的范型

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?