0

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

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

但因为为空而Activator.CreateInstance失败。tForm

我该如何解决这个问题?

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

4

3 回答 3

5

您需要使用类型的程序集限定名称

Type tForm = Type.GetType("System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
于 2012-10-24T11:26:36.947 回答
3

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

所以,你有几个选择:

  • 在字符串中包含汇编信息,即"Namespace.TypeName, AssemblyName"
  • 使用assembly.GetType(string)assembly正确的程序集在哪里
  • 手动循环当前加载的所有程序集AppDomain,依次检查每个程序集
于 2012-10-24T11:27:22.470 回答
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),则必须包含所有程序集信息 - 版本控制、公钥令牌等。

于 2012-10-24T11:26:44.067 回答