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

时间:2011-03-12 13:00:09

标签: c# reflection

我看过这个主题:Creating an instance from a class name

并编写此代码:

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键入其中一个属性来访问它的属性。我怎么能这样做?

2 个答案:

答案 0 :(得分:11)

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

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;

答案 1 :(得分:2)

您只需要将名称空间添加到类名称中。在一个控制台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());
        }
    }
}