从包含 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);
既可以减少反射的使用又可以提高安全性。
我有一个从包含 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);
既可以减少反射的使用又可以提高安全性。