我有一个字符串,我从包含类名的数据库中获取,例如:
"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。
那么如何在不知道班级类型的情况下从字符串中打开课程?
答案 0 :(得分:1)
你的答案在这里:get assembly by class name
Marc Gravell已经回答了这个问题
你必须通过你的类名找到加载的程序集(linq会帮助),然后做反思的东西来调用你的方法。
我将您的问题标记为重复。
您无法按文件名打开课程。 你的CLR如何在文件名和Class里面建立链接?
答案 1 :(得分:1)
您需要提供完整的命名空间和类名。
我可能会做这样的事情(假设命名空间总是相同的,并且类型在同一个程序集中找到):
Assembly.GetExecutingAssembly().GetType("MyApp.Scripts." + my_string);
或者,你可以
考虑安全性:这些数据来自哪里?用户可以以某种方式注入吗?可以加载任意类并可能执行。
我会使用一个界面:
IScript o = (IScript)Activator.CreateInstance(type);
两者都会减少使用更多反射并提高安全性。