如何获取给出类名的类的实例?

我已经看过这个主题: 从类名创建一个实例

并编写此代码:

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { object obj = Activator.CreateInstance(null, "MyClass"); MyClass t = (MyClass)obj; t.My1 = 100; MessageBox.Show(t.My1.ToString()); } } public class MyClass { public int My1 { get; set; } public int My2 { get; set; } } 

但是当它运行时有一个例外:

 Could not load type 'MyClass' from assembly 'Test_Reflection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

我有另一个问题。 我在一个集合中有一个类,它有一些属性。 在另一个程序集中,我想创建它的实例并通过使用stringy Class Name键入其中一个属性来访问它的属性。 我怎样才能做到这一点?

根据MSDN null实际上并不意味着当前的汇编 。 这意味着将搜索程序集(当您的类位于另一个程序集中时就是这个问题)。 此外,您不仅需要指定类名。 因此,为了防止搜索并正确获取类型,您需要编写完整的程序集限定名称 :

 Type objType = Type.GetType("YourNamespace.MyClass, YourAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); object obj = Activator.CreateInstance(objType); MyClass t = (MyClass)obj; 

您可以检索的程序集限定名称,例如下一个代码(检查您是否有误):

 string name = typeof(MyClass).AssemblyQualifiedName; 

您只需要将名称空间添加到类名称中。 在一个控制台exe项目中,这对我有用。 您确实遇到了使用返回的对象句柄的问题。 它不是Object ,而是ObjectHandle ,你需要调用Unwrap()获取实际的类型实例。

 namespace CSharpConsoleTest { public class MyClass { public int My1 { get; set; } public int My2 { get; set; } } public class Program { public static void Main(string[] args) { var obj = Activator.CreateInstance(null, "CSharpConsoleTest.MyClass"); var t = (MyClass)obj.Unwrap(); t.My1 = 100; MessageBox.Show(t.My1.ToString()); } } }