3

我对反射完全陌生,我试图从数据库记录中调用一个类名,然后加载该类并运行它,但我正在把我的头发拉到我要去的地方,这可能真的很愚蠢我迷路了。

作为示例,我将我的类放在不同的项目和脚本文件夹中,然后从 db 记录中调用它的名称。

className = String.Format("Utilities.Scripts.{0}", script.ScriptClass);

然后在我的主程序中

// Get a type from the string 
Type type = Type.GetType(className);

// Create an instance of that type
Object obj = Activator.CreateInstance(type);

// Retrieve the method you are looking for
MethodInfo methodInfo = type.GetMethod("start");

// Invoke the method on the instance we created above
methodInfo.Invoke(obj, null);

但是我得到了错误,因为在调试时我可以看到我的详细信息传递到 GetType(className) 但没有任何东西进入类型,因此进入出错的 obj 。

4

2 回答 2

3

您需要提供类型的程序集限定名称(如此所述),因为该类位于不同的项目中。此外,请确保您尝试从中加载类型的程序集与尝试加载它的程序集位于同一文件夹中,或者位于 GAC 中。

对于定义如下的类:

namespace Foo.Bar
{
    public class Class1
    {

    }
}

完整的类名是Foo.Bar.Class1. 程序集限定名称还指定程序集的全名,如Foo.Bar.Class1, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35. 您可以通过以下方式找到您的类型的程序集限定名称:

Console.WriteLine(typeof(Foo.Bar.Class1).AssemblyQualifiedName)
于 2012-10-05T15:51:27.150 回答
0

问题出在这一行:

Type type = Type.GetType(className);

因为当无法解析类型时,该方法的这种特殊重载不会引发异常。而是使用这个需要 2 个布尔值的重载,其中一个是throwOnError. 为这个参数传递 true ,你会得到一个异常,它应该可以帮助你调试为什么你的类型不能从你传入的字符串中解析出来。

我怀疑你需要一个类名程序集名

Utilities.Scripts.SomeClass, SomeAssemblyName
于 2012-10-08T13:02:25.780 回答