C#.NET - Type.GetType(“System.Windows.Forms.Form”)返回null

时间:2012-10-24 11:19:42

标签: c# .net reflection types

我的应用程序中有一段代码(引用System.Windows.Forms ),它尝试解析Form类的类型信息,如下所示:

Type tForm = Type.GetType("System.Windows.Forms.Form");
dynamic instance = Activator.CreateInstance(tForm);

Activator.CreateInstance失败,因为tForm为空。

我该如何解决这个问题?

编辑:类型必须在运行时解析!

3 个答案:

答案 0 :(得分:5)

您需要使用类型

的程序集限定名称
Type tForm = Type.GetType("System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

答案 1 :(得分:2)

检查此Jon Skeet答案:https://stackoverflow.com/a/3758295/314488

using System;
using System.Windows.Forms;

class Test
{
    static void Main()
    {
        string name = typeof(Form).AssemblyQualifiedName;
        Console.WriteLine(name);

        Type type = Type.GetType(name);
        Console.WriteLine(type);
    }
}
Output:

System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
System.Windows.Forms.Form

请注意,如果您使用强名称程序集(在本例中为Form),则必须包含所有程序集信息 - 版本控制,公钥令牌等。

答案 2 :(得分:2)

Type.GetType(string)检查一些不同的东西:如果传递的字符串包含汇编信息,那么它将在那里查看。否则,将检查调用程序集和一些其他系统程序集(可能是System和mscorlib)。它检查每个组件。

所以,你有几个选择:

  • 在字符串中包含汇编信息,即"Namespace.TypeName, AssemblyName"
  • 使用assembly.GetType(string),其中assembly是正确的程序集
  • 手动循环遍历当前AppDomain中加载的所有程序集,依次检查每个程序集