如何通过类名获取类的实例?

7
我看到了这个主题:通过类名创建一个实例 并编写了以下代码:
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'.

我有另一个问题。我有一个类在一个程序集中,其中有一些属性。在另一个程序集中,我想创建它的实例并通过输入其中一个属性的字符串类名来访问它的属性。我该怎么做?


1
你确定你实际上阅读了你正在链接的答案吗? - Jon
2
尝试指定命名空间。 - as-cii
对于你的第二个问题,你只需要在 Stack Overflow 上搜索反射即可。 - Ritch Melton
@Ritch Melton:SO是什么?请帮帮我。 - Arian
@Nima - SO = Stack Overflow。如果您查看帖子右侧,应该会看到相关主题。反思和使用属性已经被深入讨论过了。祝你好运! - Ritch Melton
显示剩余2条评论
2个回答

15
根据MSDNnull实际上并不意味着当前程序集。它意味着将搜索程序集(当您的类位于另一个程序集中时很重要)。此外,您需要指定不仅类名。因此,为了防止搜索并正确获取类型,您需要编写完整的程序集限定名称
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;

实际上它是有的(只要 current == executing?)。如果 assemblyName 为空,则搜索执行程序集。 - Ritch Melton
前两句话对我来说没有意义。你能澄清一下吗?如果它不是指当前汇编,那它是什么意思? - Ritch Melton
当MyClass位于当前程序集中时,无论如何编写都可以。但是当您需要使用另一个程序集中的类时,“null”会导致搜索该程序集。最好明确指定它。 - kyrylomyr
@archer:非常感谢。请指导我第二个问题。 - Arian
@Nima,如果我正确理解了你的问题,那么你需要添加对该程序集的引用,添加适当的命名空间使用语句和编写与我的答案中示例类似的代码。只需设置程序集限定名称字符串的正确值即可。 - kyrylomyr

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());
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接