从包含类名

时间:2016-03-22 19:43:10

标签: c# activator

我有一个字符串,我从包含类名的数据库中获取,例如: "w_task1"。当我从数据库中获取脚本名称时,我不知道它是哪个脚本,因此无法写入w_task1 t = new w_task1()

相反,我希望它与(value of class name) t = new (value of class name)()一致。

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

我尝试过使用整体:

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

...但是当程序运行时,type等于null。

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

2 个答案:

答案 0 :(得分:1)

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

Marc Gravell已经回答了这个问题

你必须通过你的类名找到加载的程序集(linq会帮助),然后做反思的东西来调用你的方法。

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

您无法按文件名打开课程。 你的CLR如何在文件名和Class里面建立链接?

答案 1 :(得分:1)

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

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

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

或者,你可以

  • 将命名空间存储到DB
  • 按名称和某些界面搜索程序集中的所有类型,可能还有更多条件。
  • 有一个字典,可以将字符串映射到众所周知的类型名称。

考虑安全性:这些数据来自哪里?用户可以以某种方式注入吗?可以加载任意类并可能执行。

我会使用一个界面:

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

两者都会减少使用更多反射并提高安全性。