C# 从包含类名的字符串调用类文件名
我从包含类名的数据库中获取一个字符串,例如: w_任务1。当我从数据库中获取脚本名称时,我不知道它是哪个脚本,因此无法编写w_task1 t=new w_task1 相反,我希望它是沿着类名的值t=类名的新值的线 我试图打开的类名不同于:w_task1.cs-w_task25 我试着使用整个: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 那
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:不一定。使用字符串格式时,不要忘记提供区域性信息。对于这样简单的事情来说,它是非常臃肿和不可读的。如果类型没有实现预期接口的情况实际上是一个编程错误,而不是用户可以做的错误,那么我希望出现类型转换异常,因此不需要特殊处理。