使用“new”关键字使用反射创建对象

时间:2012-10-05 15:35:19

标签: c# class object reflection keyword

我完全不熟悉反射,我正试图从db记录中调用一个类名,然后加载该类并运行它但是我把我的头发拉出我错的地方,它可能是我真的很傻。

作为示例,我将我的课程安排在不同的项目和脚本文件夹中,然后从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。

2 个答案:

答案 0 :(得分:3)

您需要提供类型的Assembly Qualified Name(如上所述here),因为该类位于不同的项目中。此外,请确保您尝试加载类型的程序集与尝试加载它的程序集位于同一文件夹中,或者在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)

答案 1 :(得分:0)

问题出在这一行:

Type type = Type.GetType(className);

因为当该类型无法解析时,该方法的特定重载不会抛出异常。而是使用this overload,其中包含2个布尔值,其中一个为throwOnError。对于此参数传递true,您将得到一个异常,该异常应该可以帮助您调试为什么您的类型无法从传入的字符串中解析出来。

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

Utilities.Scripts.SomeClass, SomeAssemblyName