C# 从包含类名的字符串调用类文件名

C# 从包含类名的字符串调用类文件名,c#,activator,C#,Activator,我从包含类名的数据库中获取一个字符串,例如: w_任务1。当我从数据库中获取脚本名称时,我不知道它是哪个脚本,因此无法编写w_task1 t=new w_task1 相反,我希望它是沿着类名的值t=类名的新值的线 我试图打开的类名不同于:w_task1.cs-w_task25 我试着使用整个: Type type = Type.GetType("w_task1"); object o = Activator.CreateInstance(type); …但当程序运行时,type等于null 那

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

相反,我希望它是沿着类名的值t=类名的新值的线

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

我试着使用整个:

Type type = Type.GetType("w_task1");
object o = Activator.CreateInstance(type);
…但当程序运行时,type等于null

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

您的答案如下:

Marc Gravell回答了这个问题

您必须按类名查找加载的程序集,linq将帮助您执行反射操作来调用您的方法

我把你的问题标为重复的

不能按文件名打开类。
CLR如何在文件名和内部类之间建立链接?

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

我可能会这样做,因为名称空间始终相同,并且类型位于同一程序集中:

Assembly.GetExecutingAssembly().GetType("MyApp.Scripts." + my_string);
或者,你可以

将名称空间存储到数据库 按名称和某些接口以及可能更多的条件搜索部件中的所有类型。 拥有将字符串映射到已知类型名称的字典。 考虑安全性:这些数据来自哪里?用户能以某种方式注入它吗?可以加载并可能执行任意类

我会使用一个界面:

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

将减少更多反射的使用并提高安全性。

您不会像打开文件那样打开类。加载程序集并根据其运行时类型信息实例化类。C不像python或其他脚本语言。我们已经找了很久了,找不到。谢谢最后一个问题,现在我已经实例化了这个类,我如何从它里面调用函数?首先请验证答案:第二个答案直接来自Google:谢谢,我将用它进行实验!Assembly.GetExecutionGassembly.GetTypestring.FormatMyApp.Scripts.{0},my_字符串;IScript o=Activator.CreateInstancetype为IScript;如果是IScript!=null{doSomething}更干净。@pix:不一定。使用字符串格式时,不要忘记提供区域性信息。对于这样简单的事情来说,它是非常臃肿和不可读的。如果类型没有实现预期接口的情况实际上是一个编程错误,而不是用户可以做的错误,那么我希望出现类型转换异常,因此不需要特殊处理。