我在这个网站上扫描了很多主题,搜索了互联网,并对代码进行了实验,但没有任何工作。大多数人使用的是单独的项目或程序集,我不是,它是一个存在于同一项目和相同名称空间中的自定义类。如果我通过硬编码手动构建对象,它工作正常,但我不想这样做。
这是一个C#ASPX项目,我正在从Visual Studio上调试IIS(所以这可能是问题吗?)。
Type type = Type.GetType("<namespace>."+classname);
Object obj = Activator.CreateInstance(type);
MethodInfo methodInfo = type.GetMethod(function);
response = (<cast object>)(methodInfo.Invoke(obj, null));
我的目标是变量代码,我可以编写将动态实例化的插件。 Type.GetType始终返回null。
在几乎所有情况下,type返回null或当我用其他代码将其切换时,我会得到其他错误,因为没有找到文件或程序集,而其他错误就像这个类只是不存在...
如何能够在字符串中动态构建对象,我该怎么做?假设我有一个名为“Foobar”的课程,我想这样做,
string classname = "Foobar";
Object foobar = new classname(); //easy in PHP, nightmare in C#
任何帮助都会很棒,谢谢。在你告诉我只是引用另一篇文章之前,我已经引用了很多但仍然没有成功,所以如果它不是代码而不是我在IIS上的浏览器中调试的方式呢?
答案 0 :(得分:3)
Type.GetType(String)接受程序集限定的类型名称。
答案 1 :(得分:3)
您需要从程序集中获取类型:
typeof(SomeTypeInAssembly).Assembly.GetType("Namespace.Type")
答案 2 :(得分:1)
如果它与您说的当前对象位于相同的命名空间和程序集中,您应该能够执行以下操作来获取所需的Type
:
Type type = Type.GetType(this.GetType().Namespace + "." + classname);
其余的应该像你一样工作。
答案 3 :(得分:0)
感谢您提出的建议,我在本网站上发现的建议和其他帖子中最终得到了最终代码。
string fullname = string.Format("{0}.{1}", this.GetType().Namespace, classname);
Type type = Type.GetType(fullname,true);
Baseclass class = (BaseClass)Activator.CreateInstance(type,<parameter1>,...);
MethodInfo methodInfo = type.GetMethod("<method>");
methodInfo.Invoke(class, null);
如果要处理返回类型,可以存储返回(可能需要转换)。如果他们遇到像我这样的问题,希望这可以帮助他人。
感谢Rhumborl的帖子,我想这是我最初尝试调用Type.GetType函数的一个问题。
答案 4 :(得分:-3)
String是一个本机类型,自动从对象继承,因为每个类型(aka类)都是一个对象,所以不需要做这样的事情