从包含 class 名称的字符串调用 class 文件名

Calling a class file name from a string containing the class name

我有一个从包含 class 名称的数据库中获取的字符串,例如: "w_task1"。当我从数据库中获取脚本名称时,我不知道它是哪个脚本所以不能写 w_task1 t = new w_task1().

相反,我希望它符合 (value of class name) t = new (value of class name)()

Class 我尝试打开的名称不同:w_task1.cs - w_task25.

我试过使用整个:

Type type = Type.GetType("w_task1");
object o = Activator.CreateInstance(type);

...但是程序的运行.

时type等于null

那么如何在不知道 class 类型的情况下从字符串中打开 class?

您的答案在这里:get assembly by class name

Marc Gravell 回答了这个问题

您必须通过您的 class 名称找到已加载的程序集(linq 会有所帮助),然后执行反射操作以调用您的方法。

我已将您的问题标记为重复。

您无法通过文件名打开 class。 你的CLR怎么能让文件名和里面的Class之间的link?

您需要提供完整的命名空间和 class 名称。

我可能会做这样的事情(假设命名空间总是相同的并且类型在同一个程序集中找到):

Assembly.GetExecutingAssembly().GetType("MyApp.Scripts." + my_string);

或者,您可以

  • 将命名空间存储到数据库
  • 按名称和一些接口以及可能更多的条件搜索程序集中的所有类型。
  • 有一个将字符串映射到众所周知的类型名称的字典。

考虑安全性:这些数据从何而来?用户可以以某种方式注入它吗?可以加载并可能执行任意 class。

我会使用接口:

IScript o = (IScript)Activator.CreateInstance(type);

既可以减少反射的使用又可以提高安全性。